首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >opengl -使用矢量而不是glulookat围绕球体旋转

opengl -使用矢量而不是glulookat围绕球体旋转
EN

Stack Overflow用户
提问于 2013-05-18 19:39:52
回答 2查看 781关注 0票数 0

我在使用鼠标绘制模型和旋转模型时遇到了问题,我很确定这是数学上的问题,但不确定。物体只是以一种奇怪的方式旋转。我希望对象从当前点开始旋转,而不是重置,因为现在矢量改变了,计算又重新开始了。

代码语言:javascript
运行
复制
void DrawHandler::drawModel(Model * model){
unsigned int l_index;
glClear(GL_COLOR_BUFFER_BIT |  GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); // Modeling transformation
glLoadIdentity();
Point tempCross;
crossProduct(tempCross,model->getBeginRotate(),model->getCurrRotate());
float tempInner= innerProduct(model->getBeginRotate(),model->getCurrRotate());
float tempNormA =normProduct(model->getBeginRotate());
float tempNormB=normProduct(model->getCurrRotate());
glTranslatef(0.0,0.0,-250.0);
glRotatef(acos (tempInner/(tempNormA*tempNormB)) * 180.0 / M_PI,tempCross.getX(),tempCross.getY(),tempCross.getZ());
glColor3d(1,1,1);

glBegin(GL_TRIANGLES); 
for (l_index=0;l_index < model->getTrianglesDequeSize() ;l_index++)
{

    Triangle t = model->getTriangleByPosition(l_index);
    Vertex a1 = model->getVertexByPosition(t.getA());
    Vertex a2 = model->getVertexByPosition(t.getB());
    Vertex a3 = model->getVertexByPosition(t.getC());
    glVertex3f( a1.getX(),a1.getY(),a1.getZ()); 
    glVertex3f( a2.getX(),a2.getY(),a2.getZ());
    glVertex3f( a3.getX(),a3.getY(),a3.getZ());

}
glEnd();


}

这是鼠标函数,用于保存旋转公式的起始向量

代码语言:javascript
运行
复制
    void Controller::mouse(int btn, int state, int x, int y)
{
    x=x-WINSIZEX/2;
    y=y-WINSIZEY/2;
    if (btn==GLUT_LEFT_BUTTON){
        switch(state){
        case(GLUT_DOWN):
            if(!_rotating){
                _model->setBeginRotate(Point(float(x),float(y),
                    (-float(x)*x - y*y + SPHERERADIUS*SPHERERADIUS < 0)? 0:float(sqrt(-float(x)*x - y*y + SPHERERADIUS*SPHERERADIUS))));
                _rotating=true;
            }
            break;
        case(GLUT_UP):
            _rotating=false;
            break;
        }
    }
}

最后是下面的函数,它保存了当前的向量。(起始向量是鼠标单击的位置,curr向量是鼠标当前的位置)

代码语言:javascript
运行
复制
void Controller::getMousePosition(int x,int y){
    x=x-WINSIZEX/2;
    y=y-WINSIZEY/2;
    if(_rotating){
        _model->setCurrRotate(Point(float(x),float(y),
            (-float(x)*x - y*y + SPHERERADIUS*SPHERERADIUS < 0)? 0:float(sqrt(-float(x)*x - y*y + SPHERERADIUS*SPHERERADIUS))));
    }
}

其中球面半径为70度的球面半径O_O

有没有计算错误?似乎找不到问题所在...谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-05-19 00:53:07

为什么这么复杂?您可以更改视图矩阵,也可以更改聚焦对象的模型矩阵。如果选择更改模型矩阵,并且对象在世界坐标系的(0,0,0)中居中,则计算围绕球体错觉的旋转非常简单-您只需旋转到相反的方向。如果要更改视图矩阵(实际上是在更改相机位置时完成的),则必须近似所选球体上的曲面点。因此,您可以引入两个参数来指定两个角度。每次单击移动鼠标时,都会更新参数并计算球体上的新位置。在http://en.wikipedia.org/wiki/Sphere.中有一些有用的方程式

票数 1
EN

Stack Overflow用户

发布于 2013-05-19 01:26:22

如果不知道你使用的是什么库,你的代码就很难读懂。似乎您正在将相机设置为(0,0,-250),朝向原点,然后通过两个向量model->getCurrRotate()model->getBeginRotate()之间的角度绕原点旋转。

问题似乎是,在“鼠标按下”事件中,您显式地将BeginRotate设置为鼠标下方球体上的点,然后在“鼠标移动”事件中,您将CurrRotate设置为鼠标下方的点,因此每次单击其他位置时,您都会丢失先前的旋转状态,因为BeginRotate和CurrRotate只是被覆盖。

围绕任意不同的轴组合多个旋转不是一项简单的任务。正确的方法是使用四元数。您可能会发现this primer on quaternions and other 3D math concepts很有用。

您可能还需要一种更健壮的算法来将屏幕坐标转换为球体上的模型坐标。您正在使用的是假设球体在屏幕上的半径显示为70像素,并且投影矩阵是正交的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16623849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档