1. 程式人生 > >cocos2d-x lua 3D模組學習(3)----3D物理引擎

cocos2d-x lua 3D模組學習(3)----3D物理引擎

cocos2d-x 3.X封裝的是Bullet的物理引擎

使用也是很簡單,精靈繫結剛體,設定為元件,就可以一起運動了,很方便

首先場景必須是物理世界的,這在2d還是3d中都是一樣的,不然會黑屏哦

    local pScene = cc.Scene:createWithPhysics()
    if cc.Director:getInstance():getRunningScene() then
        cc.Director:getInstance():replaceScene(pScene)
    else
        cc.Director:getInstance():runWithScene(pScene)
    end
    self._physicsScene = cc.Director:getInstance():getRunningScene()
    local winSize = cc.Director:getInstance():getWinSize()
    local physics3DWorld = self._physicsScene:getPhysics3DWorld()
為了方便除錯,我們將物理的線框給顯示出來。
physics3DWorld:setDebugDrawEnable(isDebug)

這樣3D物理系統的初始化就已經做好了

建立剛體

首先,我們需要定義一個剛體的描述型別的物件,這個物件包括了該剛體的形狀,以及質量,還有區域性變換等資訊,一般的,我們只定義剛體的質量以及形狀就足夠了。

                local rbDes = { }
                rbDes.disableSleep = true
                rbDes.mass = 1.0
                rbDes.shape = cc.Physics3DShape:createSphere(ball:getContentSize().width / 2 / 100)
                local rigidBody = cc.Physics3DRigidBody:create(rbDes)
                local component = cc.Physics3DComponent:create(rigidBody)
                Texture3D = cc.PhysicsSprite3D:create("gameBilliards/3d/ball.c3b", rbDes)
                Texture3D:setTexture("gameBilliards/3d_ball/" .. i .. ".png")
                Texture3D:setPosition(cc.p(ball:getContentSize().width / 2, ball:getContentSize().height / 2))
                Texture3D:setTag(8)
                Texture3D:setScale(s3d_Width * 2 /(ball:getContentSize().width / 2))
                Texture3D:setCameraMask(cc.CameraFlag.USER2)
                self:addChild(Texture3D)
                

注意這裡,如果是靜態物體,rbDes.mass必須不等於0,0是預設值,是靜態剛體,是不會動的,很坑爹

cc.PhysicsSprite3D:create是建立3d物理特性的精靈

rbDes.disableSleep = true是剛體的網格變為紅色,不知道效果是什麼,預設是綠色的

還有一種建立方法是繫結剛體在sprite3D上,再繫結元件。

local rbDes = {}
    rbDes.disableSleep = true
    --create box
    local sprite = cc.Sprite3D:create("Sprite3DTest/orc.c3b")
    rbDes.mass = 10.0
    rbDes.shape = cc.Physics3DShape:createBox(cc.vec3(5.0, 5.0, 5.0))
    local rigidBody = cc.Physics3DRigidBody:create(rbDes)

    local quat = cc.quaternion_createFromAxisAngle(cc.vec3(0, 1, 0), math.pi)
    local component = cc.Physics3DComponent:create(rigidBody, cc.vec3(0.0, -3.0, 0.0), quat)

    sprite:addComponent(component)
    self:addChild(sprite)
    sprite:setCameraMask(cc.CameraFlag.USER1)
    sprite:setScale(0.4)
    sprite:setPosition3D(cc.vec3(-20.0, 5.0, 0.0))
    --sync node position to physics
    component:syncNodeToPhysics()
    --physics controlled, we will not set position for it, so we can skip sync node position to physics
    component:setSyncFlag(cc.Physics3DComponent.PhysicsSyncFlag.PHYSICS_TO_NODE)

syncNodeToPhysics是同步節點到物理世界去

Physics3DComponent用以將Node的資料和剛體的資料互相關聯,同時可以指定其相對於其父節點的一些偏移設定,其設定的方法,在上一篇教程介紹PhysicsSprite3D也有提到過,在這裡,只需要將其加入到Sprite3D下就可以了。

狩獵不深,有什麼想到的再補充吧