0

3D シーンでオブジェクトを回転させたい。以下のコードでは、WorldMatrix を単純に回転させています。しかし、シーンに 1 つではなく 2 つのオブジェクトが含まれている場合はどうなるでしょうか。WorldMatrix を回転させると、両方とも (奇妙な方法で) 回転します。他のモデルを変更せずに、シーン内の 1 つのオブジェクトを回転するにはどうすればよいですか?

// 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 マトリックスが含まれている必要があります。そうすれば、1 つのオブジェクトだけを回転させたい場合は、それ自体の個人用マトリックスを編集するだけです。

これらの行列演算をすべて管理する最も簡単な方法は、汎用の行列スタックです。

残念ながら、組み込みの OpenGL マトリックス スタック機能 ( glPushglPopなど) は、古い固定関数パイプラインのほとんどと共に非推奨になっています。しかし幸いなことに、StackOverflow の仲間のユーザーが必要最小限のマトリックス スタックを投稿しました。

于 2013-10-28T14:24:09.297 に答える
0

まず、回転するオブジェクトを描画する必要があります。

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