gpt4 book ai didi

c++ - View 空间中的 OpenGL 旋转

转载 作者:行者123 更新时间:2023-12-01 14:48:06 27 4
gpt4 key购买 nike

我想在建模空间中定义一个对象以在查看空间中进行转换。平移量通过单击并拖动鼠标(变化 deltaX 和 deltaY)来控制。这是运行良好的代码:
(引用 https://gist.github.com/ptbrowne/2048812)

glPushMatrix();
glLoadMatrixd(cam2wld[cameraIndex].matrix());
glTranslated(deltaX, deltaY, 0);
glMultMatrixd(wld2cam[cameraIndex].matrix());
glMultMatrixd(obj2wld.matrix());
glGetDoublev(GL_MODELVIEW_MATRIX, obj2wld.matrix());
glPopMatrix();

我还想相对于相机(屏幕)的 x 轴旋转对象,旋转量取决于鼠标再次拖动。然而,通过改变从
glTranslated(deltaX, deltaY, 0);


glRotated(deltaX + deltaY, 1, 0, 0);

而是转换对象。知道如何解决问题吗?谢谢。

最佳答案

我假设 wld2cam[cameraIndex]是 View 矩阵和 cam2wld[cameraIndex]是逆 View 矩阵:

glLoadMatrixd(cam2wld[cameraIndex].matrix());
glRotated(deltaY, 1, 0, 0);
glMultMatrixd(wld2cam[cameraIndex].matrix());


您实际做的是围绕视点旋转模型。旋转轴 (1, 0, 0) 是 View 空间的 x 轴。如果相机到模型的距离很大,角度很小,这个旋转看起来是一个平移:

您必须为旋转定义一个枢轴。比如世界的起源。在 View 空间中世界的起源:

const GLdouble *viewMat = cam2wld[cameraIndex].matrix();
GLdouble pivotX = viewMat[12];
GLdouble pivotY = viewMat[13];
GLdouble pivotZ = viewMat[14];

glLoadMatrixd(cam2wld[cameraIndex].matrix());

glTranslated(pivotX, pivotY, pivotZ);
glRotated(deltaY, 1, 0, 0);
glTranslated(-pivotX, -pivotY, -pivotZ);

glMultMatrixd(wld2cam[cameraIndex].matrix());

如果你想做复杂的矩阵运算,那么我推荐使用像 OpenGL Mathematics (GLM) 这样的库。 :

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

glm::dmat4 c2w = glm::make_mat4<double>(cam2wld[cameraIndex].matrix());
glm::dmat4 t = glm::translate(glm::dmat4(1.0), glm::dvec3( deltaX, deltaY, 0.0));
glm::dmat4 w2c = glm::make_mat4<double>(wld2cam[cameraIndex].matrix());
glm::dmat4 o2w = glm::make_mat4<double>(obj2wld.matrix());

glm::dmat final = c2w * t * w2c * o2w;
glLoadMatrixd(glm::value_ptr(final));

关于c++ - View 空间中的 OpenGL 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61379357/

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