Как повернуть один объект в 3D-сцене?

Я хочу повернуть объект в 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();

0

Решение

Каждый «объект», который вы хотите визуализировать, должен включать, как минимум, свою собственную матрицу 4×4, содержащую информацию о повороте и положении. Таким образом, если вы хотите вращать только один объект, вы просто редактируете его собственную матрицу.

Самый простой способ управлять всеми этими матричными операциями — это общее назначение. стек матрицы.

К сожалению для вас, функциональность встроенного стека матрицы OpenGL (glPush, glPopи т. д.) не рекомендуется, как и большинство старых конвейеров с фиксированными функциями. Но, к счастью для вас, один из пользователей StackOverflow разместил стог матрицы: Замена glPush / PopMatrix.

2

Другие решения

Иметь «матрицу объектов» для каждого объекта, которую вы нажимаете перед рендерингом этого объекта, а потом выталкиваете. Имея это, вы можете изменить матрицу объектов каждого объекта, чтобы повернуть его (или преобразовать его любым другим способом).

2

Прежде всего вы должны нарисовать свой объект, чтобы вращаться.

void DrawObject(Object* object)
{
glTranslate(object->y);
glRotate(object->rotationY, roll, yaw , pitch);
}
0
По вопросам рекламы [email protected]