我和几个朋友正在尝试编写一个小的动画片段。所以,我们决定一个好的但仍然有点简单的项目是制作某种恐怖屋之旅,其中“玩家”乘坐手推车穿过废弃的矿井。
由于制作圆和直线有点无聊,我们决定做一个“稍微”更复杂的动作。我们推断我们可以导入一个带有简单顶点条带的 .obj 文件,作为移动的路径。当然,这个对象不会被绘制在屏幕上。因此,我创建了一个 Trayectory 类来处理此路径的导入。这是我用来导入路径的代码:
Trayectory::Trayectory(String^ obj)
{
this->vert = gcnew List<Point3D^>();
this->norm = gcnew List<Point3D^>();
StreamReader^ archivo=gcnew StreamReader(obj);
array<String^>^ file = archivo->ReadToEnd()->Split('\n');
archivo->Close();
for each(String^ s in file) {
array<String^>^ str = s->Split(' ');
if(str[0]=="v") {
Point3D^ tmp = gcnew Point3D(Convert::ToSingle(str[1]),Convert::ToSingle(str[2]),Convert::ToSingle(str[3]));
this->vert->Add(tmp);
}
if(str[0]=="vn") {
Point3D^ tmp = gcnew Point3D(Convert::ToSingle(str[1]),Convert::ToSingle(str[2])+1.0,Convert::ToSingle(str[3]));
this->norm->Add(tmp);
}
}
}
但是,我有两个小问题:
- 由于我使用的是顶点条,我无法为它们分配法线。有没有办法计算与 gluLookAt() 一起使用的法线?
- 当我渲染对象时,我将它转换为我的顶点列表中的一个顶点,并将它的外观分配给该行中的下一个顶点。然而,这带来了我的 .obj 中的顶点不一定有序的问题。有没有办法订购它们?我推断我可以计算出最接近每个顶点的顶点并进行类似冒泡排序的排序。但它可以更容易吗?