我和几个朋友正在尝试编写一个小的动画片段。因此,我们决定进行某种恐怖房屋之旅,其中"玩家"乘坐手推车穿越废弃的矿井。
由于制作圆和直线有点无聊,我们决定做一个"稍微"复杂的动作。我们推断,我们可以导入带有简单顶点条带的 .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中的顶点不一定是有序的。有什么办法可以订购它们吗?我推断我可以计算出哪个是每个顶点最接近的顶点,并进行类似气泡排序的排序。但它能更容易吗?
- vn 只能表示顶部 => vn 可能是 (0,0,1);在用于计算
side
向量的gluLookAt
up
向量中:side=forward X up
. - 这可能是合适的方法。不要在运行时设置顺序。