paysages: Finally fixed camera transformation !
git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@249 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
parent
e5365091aa
commit
b46d25628a
3 changed files with 12 additions and 12 deletions
|
@ -189,7 +189,7 @@ void WidgetWanderer::resizeGL(int w, int h)
|
||||||
{
|
{
|
||||||
double ratio = (double)h / (double)w;
|
double ratio = (double)h / (double)w;
|
||||||
|
|
||||||
glViewport(0, 0, (GLint)w, (GLint)h);
|
glViewport(0, 0, w, h);
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
|
@ -114,7 +114,7 @@ void cameraValidateDefinition(CameraDefinition* definition, int check_above)
|
||||||
|
|
||||||
definition->target = v3Add(definition->location, definition->forward);
|
definition->target = v3Add(definition->location, definition->forward);
|
||||||
|
|
||||||
definition->project = m4Mult(m4NewPerspective(1.57, 1.333333, 1.0, 1000.0), m4NewLookAt(VECTOR_ZERO, definition->forward, definition->up));
|
definition->project = m4Mult(m4NewPerspective(1.57, 1.333333, 1.0, 1000.0), m4NewLookAt(definition->location, definition->target, definition->up));
|
||||||
definition->unproject = m4Inverse(definition->project);
|
definition->unproject = m4Inverse(definition->project);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,25 +213,25 @@ void cameraRotateRoll(CameraDefinition* camera, double value)
|
||||||
|
|
||||||
Vector3 cameraProject(CameraDefinition* camera, Vector3 point)
|
Vector3 cameraProject(CameraDefinition* camera, Vector3 point)
|
||||||
{
|
{
|
||||||
point = m4Transform(camera->project, v3Sub(point, camera->location));
|
point = m4Transform(camera->project, point);
|
||||||
point.x = (-point.x + 1.0) * 0.5 * (double)render_width;
|
point.x = (point.x + 1.0) * 0.5 * (double)render_width;
|
||||||
point.y = (-point.y + 1.0) * 0.5 * (double)render_height;
|
point.y = (-point.y + 1.0) * 0.5 * (double)render_height;
|
||||||
return point;
|
return point;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 cameraUnproject(CameraDefinition* camera, Vector3 point)
|
Vector3 cameraUnproject(CameraDefinition* camera, Vector3 point)
|
||||||
{
|
{
|
||||||
point.x = -(point.x / (0.5 * (double)render_width) - 1.0);
|
point.x = (point.x / (0.5 * (double)render_width) - 1.0);
|
||||||
point.y = -(point.y / (0.5 * (double)render_height) - 1.0);
|
point.y = -(point.y / (0.5 * (double)render_height) - 1.0);
|
||||||
return v3Add(m4Transform(camera->unproject, point), camera->location);
|
return m4Transform(camera->unproject, point);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cameraProjectToFragment(CameraDefinition* camera, double x, double y, double z, RenderFragment* result)
|
void cameraProjectToFragment(CameraDefinition* camera, double x, double y, double z, RenderFragment* result)
|
||||||
{
|
{
|
||||||
Vector3 point = {x, y, z};
|
Vector3 point = {x, y, z};
|
||||||
point = m4Transform(camera->project, v3Sub(point, camera->location));
|
point = cameraProject(camera, point);
|
||||||
result->x = lround((-point.x + 1.0) * 0.5 * (double)render_width);
|
result->x = lround(point.x);
|
||||||
result->y = lround((-point.y + 1.0) * 0.5 * (double)render_height);
|
result->y = lround(point.y);
|
||||||
result->z = point.z;
|
result->z = point.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -331,14 +331,14 @@ Matrix4 m4NewRotateTripleAxis(Vector3 x, Vector3 y, Vector3 z)
|
||||||
|
|
||||||
Matrix4 m4NewLookAt(Vector3 eye, Vector3 at, Vector3 up)
|
Matrix4 m4NewLookAt(Vector3 eye, Vector3 at, Vector3 up)
|
||||||
{
|
{
|
||||||
Vector3 z = v3Normalize(v3Sub(eye, at));
|
Vector3 z = v3Normalize(v3Sub(at, eye));
|
||||||
Vector3 x = v3Normalize(v3Cross(up, z));
|
Vector3 x = v3Normalize(v3Cross(up, z));
|
||||||
Vector3 y = v3Cross(z, x);
|
Vector3 y = v3Cross(z, x);
|
||||||
Matrix4 result = m4NewRotateTripleAxis(x, y, v3Neg(z));
|
Matrix4 result = m4NewRotateTripleAxis(x, y, z);
|
||||||
result.d = eye.x;
|
result.d = eye.x;
|
||||||
result.h = eye.y;
|
result.h = eye.y;
|
||||||
result.l = eye.z;
|
result.l = eye.z;
|
||||||
return result;
|
return m4Inverse(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix4 m4NewPerspective(double fov_y, double aspect, double near, double far)
|
Matrix4 m4NewPerspective(double fov_y, double aspect, double near, double far)
|
||||||
|
|
Loading…
Reference in a new issue