Hola Simulatorone, esta librería no está limitada por que le falte todo esto, falta otra librería que la complemente como "motor 3d" que sería la que incluye todo lo que estamos hablando, la TinyGL en C++ es todavía mas rudimentaria que la hiper3D, esta por lo menos renderiza modelos md2 y permite rotar ya nativa XD.. en c eso se hace también a pelo o en su defecto con una función que te haces tu que aplica rotación a cava vertice.. un lío curioso XD..
Las colisiones las voy a hacer por ahora solo por esferas por que es muy sencillo, ya cuando consiga mover bien la cámara las hago en un momento, pero si quieres te adelanto la formula por si estás trasteando.. es muy simple solo tienes que hacer esto:
Dando por supuesto que las cordenadas centrales de un objeto están almacenadas en variables simples como:
Objeto A:
float x_;
float y_;
float z_;
Objeto B:
float x_;
float y_;
float z_;
Y teniendo en cuenta que en el momento de crear un objeto nuevo hay que darle un valor añadido de 'radio de colisión' que estará almacenado en esta variable:
float radius_;
Se hace esto para calcular si los objetos están solapandose uno con el otro:
Paso A, calcular la distancia 3d entre los 2 objetos, como estamos hablando de sus centros.. pues calculamos la distancia entre los dos 'puntos' o 'vectores' de la siguiente manera:
Distancia3d = sqrt( ( B.x_ - A.x_ )*( B.x_ - A.x_ ) + ( B.y_ - A.y_ )*( B.y_ - A.y_ ) + ( B.z_ - A.z_ )*( B.z_ - A.z_ ) )
Colisión = si (A.radius_ + B.radius_) es mayor o igual a Distancia3D se ha producido colisión, si es menor no se ha colisionado.
Como ves las colisiones "por esferas" son un chiste XD.. lo chungo es que estoy traduciendo esto a Gemix pero tío.. entre que una cosa está en grados y otra en radianes yo me hago la picha un lío y no se por donde tirar.. tengo algunas nociones.. pero no demasiada soltura.. y tengo que hacerlo muy despacio y pensando muy bien cada operación por que en gemix con esta librería cambia todo XD..
El código de una cámara simple en opengl usando glut es este:
[Codebox=cpp file=Untitled.cpp]#include "camera.h"
#include "math.h"
#include <iostream>
#include "windows.h"
SF3dVector F3dVector ( GLfloat x, GLfloat y, GLfloat z )
{
SF3dVector tmp;
tmp.x = x;
tmp.y = y;
tmp.z = z;
return tmp;
}
SF3dVector AddF3dVectors (SF3dVector* u, SF3dVector* v)
{
SF3dVector result;
result.x = u->x + v->x;
result.y = u->y + v->y;
result.z = u->z + v->z;
return result;
}
void AddF3dVectorToVector ( SF3dVector * Dst, SF3dVector * V2)
{
Dst->x += V2->x;
Dst->y += V2->y;
Dst->z += V2->z;
}
/***************************************************************************************/
CCamera::CCamera()
{
//Init with standard OGL values:
Position = F3dVector ( 0.0,
0.0,
0.0);
ViewDir = F3dVector( 0.0,
0.0,
-1.0);
ViewDirChanged = false;
//Only to be sure:
RotatedX = RotatedY = RotatedZ = 0.0;
}
void CCamera::GetViewDir( void )
{
SF3dVector Step1, Step2;
//Rotate around Y-axis:
Step1.x = cos( (RotatedY + 90.0) * PIdiv180);
Step1.z = -sin( (RotatedY + 90.0) * PIdiv180);
//Rotate around X-axis:
double cosX = cos (RotatedX * PIdiv180);
Step2.x = Step1.x * cosX;
Step2.z = Step1.z * cosX;
Step2.y = sin(RotatedX * PIdiv180);
//Rotation around Z-axis not yet implemented, so:
ViewDir = Step2;
}
void CCamera::Move (SF3dVector Direction)
{
AddF3dVectorToVector(&Position, &Direction );
}
void CCamera::RotateY (GLfloat Angle)
{
RotatedY += Angle;
ViewDirChanged = true;
}
void CCamera::RotateX (GLfloat Angle)
{
RotatedX += Angle;
ViewDirChanged = true;
}
void CCamera::Render( void )
{
glRotatef(-RotatedX , 1.0, 0.0, 0.0);
glRotatef(-RotatedY , 0.0, 1.0, 0.0);
glRotatef(-RotatedZ , 0.0, 0.0, 1.0);
glTranslatef( -Position.x, -Position.y, -Position.z );
}
void CCamera::MoveForwards( GLfloat Distance )
{
if (ViewDirChanged) GetViewDir();
SF3dVector MoveVector;
MoveVector.x = ViewDir.x * -Distance;
MoveVector.y = ViewDir.y * -Distance;
MoveVector.z = ViewDir.z * -Distance;
AddF3dVectorToVector(&Position, &MoveVector );
}
void CCamera::StrafeRight ( GLfloat Distance )
{
if (ViewDirChanged) GetViewDir();
SF3dVector MoveVector;
MoveVector.z = -ViewDir.x * -Distance;
MoveVector.y = 0.0;
MoveVector.x = ViewDir.z * -Distance;
AddF3dVectorToVector(&Position, &MoveVector );
}[/Codebox]
como ves no es nada de código.. pero tela para traducirlo XD.. no por que sea difícil, si no por que hay que tenerlo todo muy claro, si te ves con ganas te animo a que lo intentes también, te cuelgo un proyecto minimo en C++ con opengl que funciona, es una escena hecha a lineas con 4 for´s y el objeto cámara que funciona perfectamente, solo hay que traducir esto a nuestro 'niño'

You do not have the required permissions to view the files attached to this post.