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()
Add a comment