0

我想在 3d 场景中旋转一个对象。在下面的代码中,我只是旋转了 WorldMatrix。但是如果场景包含 2 个对象而不是 1 个呢?如果我旋转 WorldMatrix 两者都会旋转(以一种奇怪的方式)。我应该如何在不改变任何其他模型的情况下旋转场景中的单个对象?

// Clear the buffers to begin the scene.
m_OpenGL->BeginScene(0.0f, 0.0f, 0.0f, 1.0f);

// Generate the view matrix based on the camera's position.
m_Camera->Render();

// Get the world, view, and projection matrices from the opengl and camera objects.
m_OpenGL->GetWorldMatrix(worldMatrix);
m_Camera->GetViewMatrix(viewMatrix);
m_OpenGL->GetProjectionMatrix(projectionMatrix);

// Get the light properties.
m_Light->GetDirection(lightDirection);
m_Light->GetDiffuseColor(diffuseLightColor);
m_Light->GetAmbientLight(ambientLight);

// Rotate the world matrix by the rotation value so that the object will spin.
m_OpenGL->MatrixRotationY(worldMatrix, rotation);

// Set the light shader as the current shader program and set the matrices that it will use for rendering.
m_LightShader->SetShader(m_OpenGL);
m_LightShader->SetShaderParameters(m_OpenGL, worldMatrix, viewMatrix, projectionMatrix, 0, lightDirection, diffuseLightColor, ambientLight);

// Render the model using the light shader.
m_Model->Render(m_OpenGL);

// Present the rendered scene to the screen.
m_OpenGL->EndScene();
4

3 回答 3

1

您希望渲染的每个“对象”至少应包括其自己的 4x4 矩阵,其中包含旋转和位置信息。这样,如果您只想旋转单个对象,您只需编辑它自己的个人矩阵。

管理所有这些矩阵运算的最简单方法是通用矩阵堆栈

不幸的是,内置的 OpenGL 矩阵堆栈功能(glPush,glPop等)与大多数旧的固定功能管道一起被弃用。但幸运的是,StackOverflow 的一位用户发布了一个简单的矩阵堆栈:替换 glPush/PopMatrix

于 2013-10-28T14:24:09.297 回答
1

每个对象都有一个“对象矩阵”,您在渲染该对象之前推送它并在之后弹出。有了这个,您可以修改每个对象的对象矩阵以旋转它(或以任何其他方式变换它)。

于 2013-10-28T13:25:01.620 回答
0

首先,您应该绘制要旋转的对象。

void DrawObject(Object* object)
{
    glTranslate(object->y);
    glRotate(object->rotationY, roll, yaw , pitch);
}
于 2013-10-28T13:28:55.610 回答