My code takes a cubemodel, modifies its leftmost upper positions into lower positions, and the resulting model is a ramp that is supposed to be used to define the shape for physical interaction.
You’re supposed to be able to drop a ball atop the ramp and have it react accordingly.
However there seems to be some clipping going on. When you drop your first sphere, the first dropped sphere goes through the ramp and the plane it sits on.
If you were to drop a second sphere the second dropped sphere goes through the ramp but seemingly sits on the plane. If you were to continue dropping spheres they’ll stack atop each other until the fifth or so sphere, at which point they’ll roll their own separate ways either left or right of the ramp.
Here’s the code:
displayMode(OVERLAY)
function setup()
parameter.integer("CamHeight",-HEIGHT/2,HEIGHT/2,HEIGHT/2)
-- Create a new craft scene
scene = craft.scene()
scene.camera.position = vec3(HEIGHT/2,HEIGHT/2,HEIGHT/2)
floor = scene:entity()
floor.position = vec3(HEIGHT/2,-1,HEIGHT/2)
floor.model = craft.model.plane(vec2(1024,1024),vec3(0,0,0))
red = "floor.model.positions = {"
for d = 1,#floor.model.positions do
print("floor #",d," vec3",floor.model.positions[d])
red = red..",".."vec3("..floor.model.positions[d].x..","..floor.model.positions[d].y..","..floor.model.positions[d].z..")"
end
red = string.gsub(red,"{,","{").."} \
\
floor.model.indices = {"
for r = 1,#floor.model.indices do
print(floor.model.indices[r],",")
red = red..","..floor.model.indices[r]
end
red = string.gsub(red,"{,","{").."}"
--pasteboard.text = red
-- close()
floor:add(craft.rigidbody,STATIC)
floor:add(craft.shape.box,vec3(1024,2,1024),vec3(0,0,0))
mate = craft.material("Materials:Standard")
mate.diffuse = color(255, 255, 255, 255)
floor.material = mate
floor:get(craft.rigidbody).sleepingAllowed = false
floor:get(craft.renderer).mask = 1<<2
--print("vertexCount ",floor.model.vertexCount," indexCount",floor.model.indexCount)
for i = 1,#floor.model.positions do
h = floor.model:position(i)
-- print("index #",i," = vec3(",h,")")
end
ramp = scene:entity()
ramp.position = vec3(HEIGHT/2,2,HEIGHT/2)
ramp.model = craft.model.cube(vec3(13,130,13),vec3(0,0,0))
print(" theramp indexCount",ramp.model.indexCount,"theramp verts",ramp.model.vertexCount)
for out = 1,#ramp.model.positions do --this loop modifies the cube model into a simple ramp
if ramp.model.positions[out].x < 0 then
sidex = "left"
elseif ramp.model.positions[out].x > 0 then
sidex = "right"
end
if ramp.model.positions[out].y < 0 then
sidey = "down"
elseif ramp.model.positions[out].y > 0 then
sidey = "up"
end
print(sidex..sidey.."#"..out..": vec3("..ramp.model.positions[out].x..","..ramp.model.positions[out].y..","..ramp.model.positions[out].z..")")
if sidey == "up" and sidex == "left" then
sidey = "down"
ramp.model:position(out,ramp.model.positions[out].x,ramp.model.positions[3].y,ramp.model.positions[out].z)
print("now",sidex..sidey.."#"..out..": vec3("..ramp.model.positions[out].x..","..ramp.model.positions[out].y..","..ramp.model.positions[out].z..")")
end
end
ramp:add(craft.rigidbody,DYNAMIC,13)
ramp:add(craft.shape.model,ramp.model)--since you no longer are using a cube the newly formed model is
surface = craft.material("Materials:Standard")
surface.diffuse = color(0, 27, 255, 255)
ramp.material = surface
ramp:get(craft.renderer).mask = 1<<2
verticalx,horizontaly = 0,0
-- Create a new entity
bx = {}
scene.sun.position = vec3(0,0,0)
end
function update(dt)
-- Update the scene (physics, transforms etc)
scene.camera.y = CamHeight
scene.camera.eulerAngles = vec3(verticalx,horizontaly,0)
-- floor.active = true
if addit ~= nil and addit == "y" then
bx[#bx + 1] = scene:entity()
bx[#bx].position = vec3(scene.camera.x,scene.camera.y,scene.camera.z)
--surface = craft.material("Filters:Edge")
-- surface =
-- surface.diffuse = color(math.random(0,255),math.random(0,255),math.random(0,255),255)
-- surface.normalMap = ""
dimensions = vec3(6,13,6)
bx[#bx]:add(craft.rigidbody,DYNAMIC,13)
bx[#bx]:add(craft.shape.sphere,13,vec3(0,0,0))
bx[#bx].model = craft.model.icosphere(13,3,vec3(0,0,0))
bx[#bx].material = craft.material("Materials:Standard")
bx[#bx].material.diffuse = color(math.random(0,255),math.random(0,255),math.random(0,255),255)
bx[#bx]:get(craft.rigidbody).sleepingAllowed = false
bx[#bx]:add(craft.light,POINT)
bx[#bx]:get(craft.light).distance = 1024
bx[#bx]:get(craft.light).color = color(0, 0, 0, 122)
bx[#bx]:get(craft.light).angle = 45
bx[#bx]:get(craft.renderer).mask = 1<<2
print("dropped")
addit = nil
end
scene:update(dt)
end
-- Called automatically by codea
function draw()
update(DeltaTime)
-- Draw the scene
scene:draw()
end
function touched(touch)
if CurrentTouch.state == MOVING then
verticalx,horizontaly = verticalx + CurrentTouch.deltaY,horizontaly + CurrentTouch.deltaX
end
if touch.tapCount == 2 and touch.state == BEGAN then
addit = "y"
end
end