I use vector projection and rejection to calculate velocity after bouncing the side of cone, :)
#code
from visual import *
from random import uniform
display(center=(0,2,0),background=(1,1,1), autoscale=False, range=4.5,
width=600, height=600, forward=(-.4,-.3,-1)) #arah kamera
distant_light(direction=(1,1,1), color=color.red)
Cone = cone(pos = (0,0,0), axis=(0,5,0), radius = 3, opacity = .2)
bola = sphere(color=color.green,radius=.2)
bola.y = 1
bola.x = -1
bola.z = 1
v = vector(1,-1,0)
dt = 1./16
r = bola.pos
rc = Cone.radius
h = vector(Cone.axis)
def pantul():
global r,v
#tumbukan dengan lantai
if r.y<0:
r.y = 0
v.y *= -1
rp = vector(r.x,0,r.z)
hb = h.y - r.y
rmaks = hb/h.y*rc
c = h-rmaks*norm(rp) #vektor garis singgung
#selimut kerucut dengan bidang singgung
#tumbukan dengan selimut kerucut
if mag(rp)>rmaks:
rp = norm(rp)*rmaks
r = vector(rp.x,r.y,rp.z)
vp = dot(v,norm(c))*norm(c)
v = 2*vp-v
print v
def proses():
global r,v
a = vector(0,0,0)
v += a*dt
r += v*dt
bola.pos = r
pantul()
while 1:
rate(37)
proses()