美文网首页
GamePlay3D使用-Scene、Nodes

GamePlay3D使用-Scene、Nodes

作者: Lucky胡 | 来源:发表于2020-03-19 15:16 被阅读0次

    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;
    }
    

    相关文章

      网友评论

          本文标题:GamePlay3D使用-Scene、Nodes

          本文链接:https://www.haomeiwen.com/subject/tjklyhtx.html