Я хочу повернуть объект в 3D-сцене. В приведенном ниже коде я просто повернул WorldMatrix. Но что, если сцена содержит 2 объекта вместо одного? Если бы я вращал 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×4, содержащую информацию о повороте и положении. Таким образом, если вы хотите вращать только один объект, вы просто редактируете его собственную матрицу.
Самый простой способ управлять всеми этими матричными операциями — это общее назначение. стек матрицы.
К сожалению для вас, функциональность встроенного стека матрицы OpenGL (glPush
, glPop
и т. д.) не рекомендуется, как и большинство старых конвейеров с фиксированными функциями. Но, к счастью для вас, один из пользователей StackOverflow разместил стог матрицы: Замена glPush / PopMatrix.
Иметь «матрицу объектов» для каждого объекта, которую вы нажимаете перед рендерингом этого объекта, а потом выталкиваете. Имея это, вы можете изменить матрицу объектов каждого объекта, чтобы повернуть его (или преобразовать его любым другим способом).
Прежде всего вы должны нарисовать свой объект, чтобы вращаться.
void DrawObject(Object* object)
{
glTranslate(object->y);
glRotate(object->rotationY, roll, yaw , pitch);
}