Hello, Everyone.
I’ve come back to Codea Craft using a different approach to my projects; instead of attaching a camera to my objects and moving the objects by moving the attached camera, I’m using Craft.physics to apply forces and torques to objects and have the camera move and track the Craft 3D objects that have moved. AppyForce seems to work fine, but I can’t seem to get applyTorque to move my Craft objects with attached rigid bodies (please see attached video). Right now I’m just trying to rotate the crab object left and right by applying torque to the Y axis (Crab.up axis). Here is my code; I appreciate anyone’s suggestions, thanks!
viewer.mode=FULLSCREEN
function setup()
rectMode(CENTER)
scene = craft.scene()
-- turn off gravity
scene.physics.gravity = vec3(0,0,0)
-- background free download from: https://images.gamebanana.com/img/ss/mods/1873a.webp
scene.sky.material.envMap = craft.cubeTexture(asset.SeaSky)
-- setup 3D models (all availalbe online as free downloads)
-- island credit to Herminio Nieves; available at: https://www.cgtrader.com/items/843619/download-page
Island = scene:entity()
Island.model = craft.model(asset.Small_Tropical_Island.Small_Tropical_Island)
Island.scale = vec3(1,1,1)
Island.worldPosition = vec3(-480,-75,-50)
Island.eulerAngles = vec3(0,90,0)
Island:add(craft.rigidbody, STATIC)
Island:add(craft.shape.model, Island.model)
-- crab available at: http://3dmag.org/en/market/item/1590/
Crab = scene:entity()
Crab.model = craft.model(asset.crab.Crab_obj)
Crab.worldPosition = vec3(-360, -45, 90)
Crab.scale = vec3(25,25,25)
CrabRigidBody = Crab:add(craft.rigidbody, DYNAMIC)
Crab:add(craft.shape.model, Crab.model)
-- chest available at: https://www.turbosquid.com/3d-models/3d-treasure-chest-low-poly-pbrt-1875139#
Chest = scene:entity()
Chest.model = craft.model(asset.Chest.Chest)
Chest.worldPosition = vec3(-320,-45,90)
Chest.scale = vec3(0.2,0.2,0.2)
Chest:add(craft.rigidbody, STATIC)
Chest:add(craft.shape.model, Chest.model)
-- Ocean model available at: https://creazilla.com/nodes/41918-sea-and-ocean-set-3d-model
Ocean = scene:entity()
Ocean.model = craft.model(asset.ocean_sim)
Ocean.material = craft.material(asset.builtin.Materials.Standard)
Ocean.material.diffuse = color(81,102,130)
Ocean.scale = vec3(0.6,0.8,0.6)
Ocean.worldPosition = vec3(1,1,1)
Ocean.eulerAngles = vec3(0,0,0)
Ocean:add(craft.rigidbody, STATIC)
Ocean:add(craft.shape.model, Ocean.model)
-- Put camera behind Crab
followCrab()
-- Test parameter on sidescreen to rotate camera to see crab
parameter.action("MoveCrabLeft",changeObject)
parameter.action("MoveCrabRight", changeObject)
parameter.action("MoveCrabForward", changeObject)
parameter.action("MoveCrabBackward", changeObject)
parameter.action("MoveCrabUp", changeObject)
parameter.action("MoveCrabDown", changeObject)
parameter.action("RotateCrabLeft", changeObject)
parameter.action("RotateCrabRight", changeObject)
end
function draw()
update(DeltaTime)
scene:draw()
end
-- updates physics when updates(dt)
function update(dt)
scene:update(dt)
followCrab()
end
function changeObject(object)
if object == "MoveCrabLeft" then
CrabRigidBody:applyForce(Crab.right *50)
end
if object == "MoveCrabRight" then
CrabRigidBody:applyForce(-Crab.right *50)
end
if object == "MoveCrabForward" then
CrabRigidBody:applyForce(Crab.forward *50)
end
if object == "MoveCrabBackward" then
CrabRigidBody:applyForce(-Crab.forward *50)
end
if object == "MoveCrabUp" then
CrabRigidBody:applyForce(Crab.up *50)
end
if object == "MoveCrabDown" then
CrabRigidBody:applyForce(-Crab.up *50)
end
if object == "RotateCrabLeft" then
CrabRigidBody:applyTorque(Crab.up *1000)
end
if object == "RotateCrabRight" then
CrabRigidBody:applyTorque(-Crab.up *1000)
end
end
function followCrab()
scene.camera.worldPosition = Crab.worldPosition
scene.camera.rotation = Crab.rotation
scene.camera.worldPosition = scene.camera.worldPosition - (scene.camera.forward *60)
scene.camera.worldPosition = scene.camera.worldPosition + (scene.camera.up *15)
end