gpt4 book ai didi

c++ - OpenGL 中的相机旋转不使用 glRotatef gluLookAt

转载 作者:行者123 更新时间:2023-11-28 03:42:09 24 4
gpt4 key购买 nike

我试图在 OpenGL 中为相机编写自己的旋转函数,但我无法运行它。我的相机主要来自flipcode , 有一些小的变化:

相机代码:

Camera::Camera(float x, float y, float z) {
memset(Transform, 0, 16*sizeof(float));
Transform[0] = 1.0f;
Transform[5] = 1.0f;
Transform[10] = 1.0f;
Transform[15] = 1.0f;
Transform[12] = x; Transform[13] = y; Transform[14] = z;

Left=&Transform[0];
Up=&Transform[4];
Forward=&Transform[8];
Position=&Transform[12];

old_x = 0;
old_y = 0;
}

View 在每个渲染帧之前设置:

void Camera::setView() {

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

float viewmatrix[16]={//Remove the three - for non-inverted z-axis
Transform[0], Transform[4], -Transform[8], 0,
Transform[1], Transform[5], -Transform[9], 0,
Transform[2], Transform[6], -Transform[10], 0,

-(Transform[0]*Transform[12] +
Transform[1]*Transform[13] +
Transform[2]*Transform[14]),

-(Transform[4]*Transform[12] +
Transform[5]*Transform[13] +
Transform[6]*Transform[14]),

//add a - like above for non-inverted z-axis
(Transform[8]*Transform[12] +
Transform[9]*Transform[13] +
Transform[10]*Transform[14]), 1};
glLoadMatrixf(viewmatrix);
}

现在我的问题是旋转。例如考虑绕 y 轴的旋转。这是旋转矩阵堆栈:

// deg is the angle it is not working in degree or radiant
void Camera::rotateLocal_y(float deg){
glMatrixMode(GL_MODELVIEW);

glPushMatrix();
glLoadMatrixf(Transform);

rotateMatrixf_y(Transform, deg);



glGetFloatv(GL_MODELVIEW_MATRIX, Transform);
glPopMatrix();
}

所以接下来我要展示旋转功能:

//rotate a matrix around y axis
void rotateMatrixf_y(float *aMatrix, float angle){
// x y z t
float rotMatrix[] = {cos(angle),0,-1*sin(angle),0, 0, 1, 0, 0, sin(angle), 0, cos(angle), 0, 0, 0, 0, 1};

multMatrixMatrix(rotMatrix,aMatrix);

}

最后是矩阵乘法函数:

void multMatrixMatrix(float* m_a, float* m_b){
float m_c[16] = {m_a[0]*m_b[0]+m_a[4]*m_b[1]+m_a[8]*m_b[2]+m_a[12]*m_b[3],
m_a[0]*m_b[4]+m_a[4]*m_b[5]+m_a[8]*m_b[6]+m_a[12]*m_b[7],
m_a[0]*m_b[8]+m_a[4]*m_b[9]+m_a[8]*m_b[10]+m_a[12]*m_b[11],
m_a[0]*m_b[12]+m_a[4]*m_b[13]+m_a[8]*m_b[14]+m_a[12]*m_b[15],

m_a[1]*m_b[0]+m_a[5]*m_b[1]+m_a[9]*m_b[2]+m_a[13]*m_b[3],
m_a[1]*m_b[4]+m_a[5]*m_b[5]+m_a[9]*m_b[6]+m_a[13]*m_b[7],
m_a[1]*m_b[8]+m_a[5]*m_b[9]+m_a[9]*m_b[10]+m_a[13]*m_b[11],
m_a[1]*m_b[12]+m_a[5]*m_b[13]+m_a[9]*m_b[14]+m_a[13]*m_b[15],

m_a[2]*m_b[0]+m_a[6]*m_b[1]+m_a[10]*m_b[2]+m_a[14]*m_b[3],
m_a[2]*m_b[4]+m_a[6]*m_b[5]+m_a[10]*m_b[6]+m_a[14]*m_b[7],
m_a[2]*m_b[8]+m_a[6]*m_b[9]+m_a[10]*m_b[10]+m_a[14]*m_b[11],
m_a[2]*m_b[12]+m_a[6]*m_b[13]+m_a[10]*m_b[14]+m_a[14]*m_b[15],

m_a[3]*m_b[0]+m_a[7]*m_b[1]+m_a[11]*m_b[2]+m_a[15]*m_b[3],
m_a[3]*m_b[4]+m_a[7]*m_b[5]+m_a[11]*m_b[6]+m_a[15]*m_b[7],
m_a[3]*m_b[8]+m_a[7]*m_b[9]+m_a[11]*m_b[10]+m_a[15]*m_b[11],
m_a[3]*m_b[12]+m_a[7]*m_b[13]+m_a[11]*m_b[14]+m_a[15]*m_b[15]
};

m_b = m_c;

}

我虽然一定是这样,但似乎有什么根本性的错误。它根本不动。相机设置正确。方法顺序是:cam.rotate 然后是 cam.setView

Flipcodes独创的旋转功能:

void Camera::rotateLoc(float deg, float x, float y, float z) {

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadMatrixf(Transform);

glRotatef(deg, x,y,z);

glGetFloatv(GL_MODELVIEW_MATRIX, Transform);
glPopMatrix();
}

最佳答案

您的代码非常困惑且不完整。

我认为你的问题在这里:

glPushMatrix();
glLoadMatrixf(Transform); // give the Transform matrix to GL (why?)

rotateMatrixf_y(Transform, deg); // modify the Transform matrix

glGetFloatv(GL_MODELVIEW_MATRIX, Transform); // (3) retrieve the original Tranform matrix
glPopMatrix();

(3) 通过调用“rotateMatrixf_y”来撤消您在“转换”中所做的任何更改。

您添加的 flipcode 代码使用 OpenGL 通过调用 glRotatef' 并读回结果来更新 Tranform 矩阵,这很好。在您的方法代码中,您应该只删除对 OpenGL 的所有引用,并只保留对 rotateMatrixf_y 的调用,它会自行完成所有工作。

你真的了解GL矩阵栈有什么用吗?您或许应该通过仅使用 GL 函数或使用您自己的函数来回到基础知识,但在混合使用之前了解它以任何一种方式工作的原因。

关于c++ - OpenGL 中的相机旋转不使用 glRotatef gluLookAt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8810341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com