到目前为止,我在想的是这样的:
>转换树实现.
>模拟动力学(*)
>用于碰撞检测的八叉树实现.
>实际碰撞检测(*)
>在Maya中建模并将其导出为.OBJ.
>使用GLSL抛光游戏或类似于图形质量的游戏.
(*):我不知道这两个的顺序.
所以我开始模拟动态,没有一个树实现,结果是对我来说是一个巨大的混乱.有什么办法可以想到可以帮助我建立这样一棵树在赛车游戏中使用的东西吗?
我想到了这样的东西,但我不知道如何实现它.
红色是静态的,黄色是动态节点
解决方法
从单车和无限的道路开始.
将渲染和动态的问题分解成两个完全不同的东西.常见的汽车更新和/或是CarRenderModel和CarPhysicsModel之间的链接.
汽车在GL场景中的形状取决于汽车.
除此之外,这意味着您可以在屏幕上显示一个非常简单的车载显示器,并为其添加一个非常简单的物理模型,并且使得汽车更漂亮,或使其行为更好,而无需将两者结合在一起.而且,理想情况下,在每个阶段你都可以玩.
所以,一辆长方形的车,5长3宽,1单位高.一条宽13公分的路,永远不变.固定相机.也许是一个地平线.第一个物理模型是一个火箭船,每秒钟你按下箭头键,汽车在这个方向上获得x单位/秒的速度.请注意,该车不旋转 – 它是轴对齐的.如果汽车离开路,就会爆炸,“游戏”结束.
您现在可以在屏幕上显示响应用户输入的内容.你可以花时间做一个爱好者的汽车模型(车轮等),或者你可以改善汽车物理和控制模型(方向!角度!打破!=加速!),或者你可以使环境更有趣(添加黑色 – 白色条纹,所以你可以看到路边缘的速度,路边越野部分,也许树木吹起车),或者你可以使相机更有趣(说,它停留在车,看着它的肩膀).
现在,对于动力学,我将使用车载互动中的不同代码来对待宇宙 – 汽车交互,只是为了保持我的完整性.汽车没有修改环境.
这意味着你可以比汽车交互更容易地编写一堆汽车宇宙交互.
…
在C中构建任意树很容易.
#include <vector> #include <memory> #include <string> struct MyTree; typedef std::unique_ptr<MyTree> upTree; // punt on memory management! struct MyBaseNode; typedef std::unique_ptr<MyBaseNode> upNode; struct MyTree { std::vector<upTree> children; upNode node; MyTree( upNode node_ ):node(std::move(node_)) {} private: // if C++11 compiler,use these: MyTree( MyTree const& ) = delete; MyTree& operator=( MyTree const& ) = delete; // if C++03,use these: // MyTree( MyTree const& ); // no implementation // MyTree& operator=( MyTree const& ); // no implementation }; upTree make_tree(upNode node) { return upTree( new MyTree(std::move(node)) ); } enum EOrder{ eFirst,eMiddle,eLast }; template<typename Functor> void walk_tree( upTree const& tree,Functor f,bool bFirst = true,bool bLast = true) { if (!tree) return; f( tree,bFirst,bLast ); for (auto it = tree->children.begin(); it != tree->children.end(); ++it) { bool bChildFirst = (it == tree->children.begin()); bool bChildLast = ((it+1) == tree->children.end()); walk_tree( *it,f,bChildFirst,bChildLast ); } } struct MyBaseNode { virtual ~MyBaseNode() {}; // put things that your tree nodes have to be able to do here // as pure virtual functions... virtual std::string MyName() const = 0; }; struct CarsNode : MyBaseNode { // cars node implementation! virtual std::string MyName() const /*override*/ { return "I am a bunch of CARS!"; } }; upNode make_cars() { return upNode( new CarsNode() ); } struct CarNode : MyBaseNode { // car node implementation! virtual std::string MyName() const /*override*/ { return "I am a CAR!"; } }; upNode make_car() { return upNode( new CarNode() ); } struct RoadNode : MyBaseNode { // car node implementation! virtual std::string MyName() const /*override*/ { return "I am a ROAD!"; } }; upNode make_road() { return upNode( new RoadNode() ); } #include <iostream> void tree_printer_func( upTree const& tree,bool bFirst,bool bLast ) { if (bFirst) std::cout << "[ "; if (tree->node) { std::cout << tree->node->MyName().c_str(); } else { std::cout << "nullNode"; } if (bLast) { std::cout << " ]\n"; } else { std::cout << ","; } } int main() { upTree root = make_tree(upNode()); upTree carsTree = make_tree(make_cars()); carsTree->children.push_back( make_tree( make_car() ) ); carsTree->children.push_back( make_tree( make_car() ) ); root->children.push_back( std::move(carsTree) ); upTree roadTree = make_tree(make_road()); root->children.push_back( std::move(roadTree) ); walk_tree( root,tree_printer_func ); }
以上是非常粗糙的(例如,我没有在打印机中得到终端节点处理相当正确),但是它在C中演示了一个非均匀的,非泄漏的n-ary树结构.