Scene
Scene是一个3D场景,用来放置模型、声音、动画和物理特性的物体。
Node是用来附着各种模型,用来做移动转换等。
简单场景,scene可以放两个Node。一个node可以放Camera,一个node放Model。
将相机作为Scene的active camera。通过transfer两个node来转换视角。
有下面几个组件可以依附到node上:
1、Model:放置模型
2、Camera:观察视角
3、Light:光照,影响model的渲染
4、PhysicsCollisionObject : 有物理特性的
5、ParticleEmitter:粒子
6、Terrain :地形图
7、AudioSource:放置音频
8、Form:用户交互界面
加载FBX文件
首先将fbx文件转换为Gameplay识别的文件:
gameplay-encoder duck.fbx
然后用Bundle加载二进制包:
void MeshGame::initialize()
{
// Load the scene from our gameplay binary file
Bundle* bundle = Bundle::create("res/duck.gpb");
Scene* scene = bundle->loadScene();
SAFE_RELEASE(bundle);
// Get handles to the nodes of interest in the scene
_modelNode = scene->findNode("duck");
Node* _lightNode = scene->findNode("directionalLight1");
Node* _cameraNode = scene->findNode("camera1");
// More initialization ...
}
更新场景
为了优化性能,最好只更新那些确实发生了变化的组件:
void MyGame::update(float elapsedTime)
{
// Rotate the model
if (!_touched)
_modelNode->rotateY(elapsedTime * MATH_DEG_TO_RAD(0.05f));
}
}
常见的变化包括:
1、对物体施加了力或刺激
2、物体发生位移、旋转等
3、开始或结束动画
4、显示或隐藏
刷新场景
需要绘制所有的node,利用Scene::visit()方法来获取scene里的所有node
void MyGame::render(float elapsedTime)
{
// Clear the buffers to black
clear(CLEAR_COLOR_DEPTH, Vector4::zero(), 1.0f, 0);
// Visit all the nodes in the scene, drawing the models/mesh.
_scene->visit(this, &MyGame::drawScene);
}
bool MyGame::drawScene(Node* node, void* cookie)
{
// This method is called for each node in the scene.
Model* model = node->getModel();
if (model)
model->draw();
return true;
}
不绘制不可见model
有的model不可见,在视野外了,就不用绘制来节约性能。
可以用相机的视野来计算某model是否可见:
bool MeshGame::drawScene(Node* node, void* cookie)
{
// Only draw visible nodes
if (node->getBoundingSphere()->intersect(_camera->getFrustum())
{
Model* model = node->getModel();
if (model)
model->draw();
}
return true;
}
网友评论