- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在 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/
有什么区别 glRotatef(angle, 1.0f, 0.0f, 0.0f); glRotatef(angle, 0.0f, 0.0f, 1.0f); 和 glRotatef(angle, 1.0
我正在尝试使用 glRotatef 在空间中旋转特定对象。我不确定它是如何在引擎盖下工作的,所以我不确定我为对象顶点设置的法向量是否会随着顶点坐标一起旋转。我只需要知道它是否确实也旋转了法线。 最佳答
我将在C++ OpenGL,MFC应用程序中制作一个旋转球体。 所以我声明了一个在demo.h中具有旋转速度的变量: GLfloat angle; void Init(); 另外,我初始化了该变量,并
我是 openGl 的初学者。我正在做非常基本的事情。只想将对象绕 x 轴旋转 20.0 度。但它不是旋转而是向上移动。 谁能帮我解决我做错的地方。 下面是我的代码, void drawScene()
基本上我想打开一扇门,我想到了使用 glRotatef。我的问题是它影响了在它之后绘制的每个对象。有谁知道如何阻止它? 门类 public static void draw(Texture d
问题来了:我的三角形不旋转!为什么?我做错了什么? 代码如下: 主要.cpp #include #include #include #include "myobject.h" using nam
我正在尝试围绕其中心旋转四边形,但是当我运行该应用程序时,四边形围绕屏幕的 0,0 位置旋转,我无法弄清楚为什么,因为一切看起来都很好。任何帮助将不胜感激。 glPushMatrix(); glTra
我想在 opengl 中使用欧拉角。有些人建议像这样: glRotatef(Rx,1,0,0); glRotatef(Rx,0,1,0); glRotatef(Rx,0,0,1); 当然,如果您一次向
我是第一次尝试 OpenGL,所以我想编写一个简单的程序来显示一个框并让我移动相机。 由于 OpenGL 中没有相机这样的东西,我只是通过让整个世界以完全相反的方式移动来模拟我想要的每一个“相机运动”
我正在尝试创建一个多边形并在松开鼠标按钮时平移/旋转它。如果我使用 glBegin 和 glEnd 重新绘制我的整个多边形,我可以做到这一点,但我不确定我是否真的需要这个,因为我已经在上面绘制了多边形
假设我在点 (50,60,20) 处画了一幅画,我想在 table 的每一侧旋转它。在下图的基础上,我想将绿色圆圈旋转到右侧、背面和左侧。我的实现是 glRotatef(plate_rotate, 5
glRoatef 函数不起作用我不知道为什么...... 下面的代码这是显示函数,它在主循环中也使用 SDL 调用: void display(){ glClear(GL_COLOR_BUFFER_B
我只想说清楚。我对 Open GL 还是个新手,主要是通过反复试验来学习。 当我使用 glRotatef(angle, x, y, z) 时 我从那个点开始画的任何东西都会在指定的轴上旋转指定的量?
我无法理解 glrotatef 的机制或它是如何工作的,经过一些研究我发现它包含 4 个变量,它们是我用来旋转的角度,1 或 0 代表 x 轴,1或 0 代表 y 轴,1 或 0 代表 z 轴。 回答
当我这样调用 glRotatef 时: glRotatef(angle,0.0,1.0,0.0) //rotate about y-axis 我知道是绕y轴旋转angle度数。 但是,什么在这里轮换?
我是 PyOpenGL 的新手。我使用它编写了一个简单的代码来显示一个立方体,您可以使用键盘在它周围导航。但是,我注意到在调用 glRotatef 命令后,它会改变您的视角,而不是对象的位置。但是,
我正在尝试使用 opengl 和命令 gl.glroate 让对象旋转,但似乎没有发生任何事情,任何人都可以告诉我哪里出了问题吗?下面是代码 import javax.media.opengl.*;
我在用纯 C 语言编写 glRotatef 的替代函数时遇到问题。我需要实现参数为:点列表、角度和旋转 vector 的函数。函数必须返回旋转后的点列表。我的函数如下所示: void rotate(f
我正在尝试为 Blade 创建一个扭曲效果(不是旋转),但它根本不起作用。特别是,我正在尝试使用 glRotatef 函数来旋转轴并使其看起来像 Blade 在扭曲。 任何帮助都会很棒。 #inclu
我试图在 OpenGL 中为相机编写自己的旋转函数,但我无法运行它。我的相机主要来自flipcode , 有一些小的变化: 相机代码: Camera::Camera(float x, float y,
我是一名优秀的程序员,十分优秀!