cocos2d-x lua 3D模組學習(3)----3D物理引擎
阿新 • • 發佈:2019-02-19
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下就可以了。
狩獵不深,有什麼想到的再補充吧