我一直在尝试在OpenGL中创建一个过山车模拟器,它使用一系列gluLookAt调用来让相机“骑”过山车。过山车本身基于b样条曲线,其中控制点位于coords数组中。 b0(u),b1(u)等是b样条曲线的混合函数,bprime0(u)等是它们的导数。这是我的代码的相关部分:
for (int i = 0; i <= 10; i++){
for (float u = 0; u <= 1.1; u+=0.1){
x = (b0(u)*coords[(i)%10].x + b1(u)*coords[(i+1)%10].x
+ b2(u)*coords[(i+2)%10].x + b3(u)*coords[(i+3)%10].x)*2.0f;
y = (b0(u)*coords[(i)%10].y + b1(u)*coords[(i+1)%10].y
+ b2(u)*coords[(i+2)%10].y + b3(u)*coords[(i+3)%10].y)*2.0f;
z = (b0(u)*coords[(i)%10].z + b1(u)*coords[(i+1)%10].z
+ b2(u)*coords[(i+2)%10].z + b3(u)*coords[(i+3)%10].z)*2.0f;
xprime = (bprime0(u)*coords[(i)%10].x + bprime1(u)*coords[(i+1)%10].x
+ bprime2(u)*coords[(i+2)%10].x + bprime3(u)*coords[(i+3)%10].x)*-2.0f;
yprime = (b0(u)*coords[(i)%10].y + bprime1(u)*coords[(i+1)%10].y
+ bprime2(u)*coords[(i+2)%10].y + bprime3(u)*coords[(i+3)%10].y)*-2.0f;
zprime = (b0(u)*coords[(i)%10].z + bprime1(u)*coords[(i+1)%10].z
+ bprime2(u)*coords[(i+2)%10].z + bprime3(u)*coords[(i+3)%10].z)*-2.0f;
Coords nvector = {xprime,yprime,zprime};
float magn = sqrt(nvector.x*nvector.x+nvector.y*nvector.y+nvector.z*nvector.z);
nvector.x= nvector.x/magn;
nvector.y= nvector.y/magn;
nvector.z= nvector.z/magn;
glLoadIdentity();
if (rotateCam == 1){
theta+=0.0001;
if (theta > 360) {
theta = 0;
}
gluLookAt(20*cos(theta),15,20*sin(theta),0,0,0,0,1,0);
}//if
else{
printf("%f\t%f\t%f\n", x+xprime,y+yprime,z+zprime);
gluLookAt(x,y+1,z,x+xprime,y+yprime,z+zprime,0,1,0);
}//else
}//for
}//for
空格键切换'rotateCam'变量,该变量应该在两种观看模式之间切换;一个围绕过山车环绕相机('if'声明)和一个骑过过山车的人('else'声明)。
这就是事情:盘旋模式工作正常,并且模式之间切换工作正常,但相机在“骑行”模式下始终保持静止。 printf语句显示x,xprime,y,yprime等都随着每个计时器滴答而改变,但摄像机从不移动。
如果需要更多代码,请与我联系。
答案 0 :(得分:0)
gluLookAt
没有定位cemera,只会将其旋转到正确的角度。在此之后,您还可以翻译它。所以这应该可以解决问题:
gluLookAt(x,y+1,z,x+xprime,y+yprime,z+zprime,0,1,0);
gluTranslated(x,y+1,z);