旋转对象及其'children'
Rotating an object and its 'children'
现在我正在旋转一个对象,让我们称其为'主体',但附着在主体上是几个附件,当我旋转主体时,它们也应该旋转,但是现在他们没有。我不使用父母/子系统。主体具有一系列的附件,并将其绘制在主体绘制功能中。
绘制设备项目后,主体的glpopmatrix()完成。
我知道我过去曾使用pushmatrix()做到这一点;和popmatrix();但是现在似乎不起作用了。
我正在使用C ,OpenGL和GLM。
这是一些代码,向您显示我现在拥有的内容:
{
setupStartModelMatrix(); //<---- Has glPushMatrix();
setupModelviewMatrix(); //<--- has all the gml stuff
drawMainBody();
}
if(mNumberOfEquipementOwned != 0)
{
for(int i = 0; i < mNumberOfEquipementOwned; i++)
{
//obj is retrieved with a function
obj->render();
}
}
setupEndModelMatrix(); // <--- Has glPopMatrix();
}
和GLM代码
void GameObject::setupModelviewMatrix()
{
glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f);
glm::mat4 Model = glm::scale( glm::mat4(1.0f), glm::vec3(1.0f));
glm::mat4 ViewTranslate = glm::translate( glm::mat4(1.0f), glm::vec3(mPosition.x, mPosition.y, mPosition.z));
glm::mat4 ViewRotateX = glm::rotate( ViewTranslate, mRotation.x, glm::vec3(1.0f, 0.0f, 0.0f));
glm::mat4 ViewRotateY = glm::rotate( ViewRotateX, mRotation.y, glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 View = glm::rotate( ViewRotateY, mRotation.z, glm::vec3(0.0f, 0.0f, 1.0f));
glm::mat4 MVP = View * Model;
glUniformMatrix4fv( 0, 1, GL_FALSE, glm::value_ptr(MVP));
glLoadMatrixf(glm::value_ptr(MVP));
}
和抽奖设备代码
void Gun::render()
{
glPushMatrix();
setupModelviewMatrix();
mMesh->render();
glPopMatrix();
}
我的猜测是您正在调用glPushMatrix()
,旋转,绘制主体,调用glPopMatrix()
,然后绘制附件。如果这是真的,请将glPopMatrix()
调用移至绘制附件后。
由于蒂姆,我注意到我的矩阵也没有传递到其他方面。当我终于理解他在说什么时,这很容易解决,所以100%的道具都去找他。
现在,任何可能需要它的人的代码。
{
glm::mat4 startingModel(1.0);
setupStartModelMatrix();
startingModel = continuedModelvieuwMatrix(startingModel);
drawMainBody();
}
if(mNumberOfEquipementOwned != 0)
{
for(int i = 0; i < mNumberOfEquipementOwned; i++)
{
//obj is retrieved with a function
obj->render(startingModel);
}
}
setupEndModelMatrix(); // <--- Has glPopMatrix();
}
和GLM代码
glm::mat4 GameObject::continuedModelvieuwMatrix(glm::mat4 startingModel)
{
glm::mat4 Model = glm::scale( glm::mat4(1.0f), glm::vec3(1.0f));
glm::mat4 ViewTranslate = glm::translate( startingModel, glm::vec3(mPosition.x, mPosition.y, mPosition.z));
glm::mat4 ViewRotateX = glm::rotate( ViewTranslate, mRotation.x, glm::vec3(1.0f, 0.0f, 0.0f));
glm::mat4 ViewRotateY = glm::rotate( ViewRotateX, mRotation.y, glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 View = glm::rotate( ViewRotateY, mRotation.z, glm::vec3(0.0f, 0.0f, 1.0f));
glm::mat4 MVP = View * Model;
glUniformMatrix4fv( 0, 1, GL_FALSE, glm::value_ptr(MVP));
glLoadMatrixf(glm::value_ptr(MVP));
return MVP;
}
void GameObject::setupStartModelMatrix()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
和抽奖设备代码
void Gun::render(glm::mat4 startingModel)
{
glm::math4 tempModel;
tempModel = continuedModelvieuwMatrix(startingModel);
mMesh->render();
}
那就是关于它的。由于我的对象构造,我不得不100%确定此代码是否有效,因为我必须以不同的方式为自己修复它,但这至少应该给有相同问题的人提供一个良好的开始。
也不需要GlpopMatrix()或Glpushmatrix()来完成此工作。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 旋转对象及其'children'