私は OpenGL を使用して一人称シューティング ゲームを構築しています。銃のモデルをカメラの前に浮かせようとしています。リソース逆コンパイラ (.obj に変換してロード) を使用して、Fallout 3 からモデルをリッピングしました。
ただし、画面上では次のように表示されます。
銃の三角形の半分は、円錐台と思われる部分にクリップされています。
こんな感じでカメラの前に置きました。
glPushMatrix();
glLoadIdentity();
glTranslatef(m_GunPos.x, m_GunPos.y, m_GunPos.z);
glRotatef(m_GunRot.x, 1, 0, 0);
glRotatef(m_GunRot.y, 0, 1, 0);
glRotatef(m_GunRot.z, 0, 0, 1);
glScalef(m_GunScale.x, m_GunScale.y, m_GunScale.z);
m_Gun->Render(NULL);
glPopMatrix();
そこで、元のマトリックスを保存しGL_MODELVIEW
、恒等マトリックスをロードし、銃をカメラの少し右側に移動してレンダリングします。これは、SceneNode のレンダリング ルーチンです。
glPushMatrix();
if (m_Model) { m_Model->Render(&final); }
if (m_Children.size() > 0)
{
for (std::vector<SceneNode*>::iterator i = m_Children.begin(); i != m_Children.end(); ++i)
{
(*i)->Render(&final);
}
}
glPopMatrix();
そのため、独自のモデルと子 SceneNode をレンダリングします。最後に、実際のメッシュ レンダリングは次のようになります。
if (m_Material)
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_Material->m_TexDiffuse);
}
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vec3), &m_Vertex[0]);
glNormalPointer(GL_FLOAT, sizeof(Vec3), &m_Normal[0]);
glTexCoordPointer(2, GL_FLOAT, 0, &m_UV[0]);
glDrawArrays(GL_TRIANGLES, 0, m_Vertex.size());
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
銃だけのクリッピングをオフにする方法はありますか? 他のゲームはどのようにこれを行うのですか?
前もって感謝します。