现在我的应用程序在camera.rotationX,Y Z上旋转,并在modelview矩阵上进行camera.x,y,z的翻译。我怎么能把它变成对gluLookAt的调用呢?
谢谢
基本上我怎么能得到这个:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//starts here
glRotatef(Camera.rotx,1,0,0);
glRotatef(Camera.roty,0,1,0);
glRotatef(Camera.rotz,0,0,1);
glTranslatef(-Camera.x , -Camera.y - 4.5,-Camera.z );
而是调用gluLookAt会使它看起来一样。
由于
我想这样做的原因是因为我发现了一个与gluLookAt一起使用的fustrum剔除类,如下所示
void FrustumG::setCamDef(Vec3 &p, Vec3 &l, Vec3 &u) {
Vec3 dir,nc,fc,X,Y,Z;
Z = p - l;
Z.normalize();
X = u * Z;
X.normalize();
Y = Z * X;
nc = p - Z * nearD;
fc = p - Z * farD;
ntl = nc + Y * nh - X * nw;
ntr = nc + Y * nh + X * nw;
nbl = nc - Y * nh - X * nw;
nbr = nc - Y * nh + X * nw;
ftl = fc + Y * fh - X * fw;
ftr = fc + Y * fh + X * fw;
fbl = fc - Y * fh - X * fw;
fbr = fc - Y * fh + X * fw;
pl[TOP].set3Points(ntr,ntl,ftl);
pl[BOTTOM].set3Points(nbl,nbr,fbr);
pl[LEFT].set3Points(ntl,nbl,fbl);
pl[RIGHT].set3Points(nbr,ntr,fbr);
pl[NEARP].set3Points(ntl,ntr,nbr);
pl[FARP].set3Points(ftr,ftl,fbl);
}
答案 0 :(得分:2)
不要使用gluLookAt,glRotate或glOrtho OpenGL 3规范。去抓住glm库http://glm.g-truc.net/并改为执行此操作......
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/transform2.hpp>
glm::vec4 position = glm::vec4( 1.0f, 0.0f, 0.0f, 1.0f );
glm::mat4 view = glm::lookAt( glm::vec3(0.0,0.0,5.0),
glm::vec3(0.0,0.0,0.0),
glm::vec3(0.0,1.0,0.0) );
glm::mat4 model = glm::mat4(1.0f);
model = glm::rotate( model, 90.0f, glm::vec3(0.0f,1.0f,0.0) );
glm::mat4 mv = view * model;
glm::vec4 transformed = mv * position;
答案 1 :(得分:1)
你的眼睛位置E将是(Camera.x,Camera.y + 4.5,Camera.z)。 如果我没记错的话,OpenGL中的默认视图向量V是(0,0,-1) 默认向上向量U是(0,1,0)。
所以你用相机旋转旋转这两个矢量。 请参阅http://en.wikipedia.org/wiki/Rotation_matrix或http://en.wikipedia.org/wiki/Quaternion。 然后中心是旋转的视图矢量视图矢量+相机矢量。 向上传感器只是旋转向上的矢量。
gluLookAt(Camera.x, Camera.y + 4.5, Camera.z, Camera.x + V.x, Camera.y + V.y, Camera.z + V.z, U.x, U.y, U.z)
gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz : glDouble);