e7add63e21493bd6a9eab131d205710dff9f0cf6
1 from panda3d
.core
import CullFaceAttrib
2 from panda3d
.bullet
import BulletBoxShape
, BulletRigidBodyNode
6 def __init__(self
, world
):
8 shape
= BulletBoxShape((.5, .5, .5))
9 self
.node
= BulletRigidBodyNode('box')
10 self
.node
.add_shape(shape
)
11 self
._np
= render
.attach_new_node(self
.node
)
12 self
._np
.set_pos(0, 0, 1)
13 world
.attach_rigid_body(self
.node
)
14 model
= loader
.load_model('assets/gltf/box/box.gltf')
16 model
.reparent_to(self
._np
)
17 self
._set
_outline
_model
()
18 self
._start
_drag
_pos
= None
19 self
._start
_rot
_info
= None
20 taskMgr
.add(self
.on_frame
, 'on_frame')
22 def _set_outline_model(self
):
23 self
._outline
_model
= loader
.load_model('assets/gltf/box/box.gltf')
24 clockw
= CullFaceAttrib
.MCullClockwise
25 self
._outline
_model
.set_attrib(CullFaceAttrib
.make(clockw
))
26 self
._outline
_model
.reparent_to(self
._np
)
27 self
._outline
_model
.set_scale(-1.08, -1.08, -1.08)
28 self
._outline
_model
.set_light_off()
29 self
._outline
_model
.set_color(.4, .4, .4, 1)
30 self
._outline
_model
.set_color_scale(.4, .4, .4, 1)
31 self
._outline
_model
.hide()
33 def on_frame(self
, task
):
38 self
._world
.remove_rigid_body(self
.node
)
40 self
._world
.attach_rigid_body(self
.node
)
42 def on_click_l(self
, pos
):
43 self
._start
_drag
_pos
= pos
, self
._np
.get_pos()
45 def on_click_r(self
, pos
):
46 self
._start
_rot
_info
= pos
, self
._np
.get_pos(), self
._np
.get_r()
49 self
._start
_drag
_pos
= self
._start
_rot
_info
= None
51 def on_mouse_on(self
):
52 self
._outline
_model
.show()
54 def on_mouse_off(self
):
55 if self
._start
_drag
_pos
or self
._start
_rot
_info
: return
56 self
._outline
_model
.hide()
58 def on_mouse_move(self
, pos
):
59 if self
._start
_drag
_pos
:
60 d_pos
= pos
- self
._start
_drag
_pos
[0]
61 self
._np
.set_pos(self
._start
_drag
_pos
[1] + d_pos
)
62 if self
._start
_rot
_info
:
63 start_vec
= self
._start
_rot
_info
[0] - self
._start
_rot
_info
[1]
64 curr_vec
= pos
- self
._start
_rot
_info
[1]
65 d_angle
= curr_vec
.signed_angle_deg(start_vec
, (0, -1, 0))
66 self
._np
.set_r(self
._start
_rot
_info
[2] + d_angle
)