mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-29 16:20:11 -04:00
samples: improvements to flight stick sample program
This commit is contained in:
parent
d764574d07
commit
3d66e22905
@ -1,10 +1,9 @@
|
||||
#!/usr/bin/env python
|
||||
'''
|
||||
Demonstrate usage of steering wheels
|
||||
Demonstrate usage of flight stick
|
||||
|
||||
In this sample you can use a wheel type device to control the camera and
|
||||
show some messages on screen. You can acclerate forward using the
|
||||
accleration pedal and slow down using the break pedal.
|
||||
In this sample you can use a flight stick to control the camera and show some
|
||||
messages on screen. You can accelerate using the throttle.
|
||||
'''
|
||||
|
||||
from direct.showbase.ShowBase import ShowBase
|
||||
@ -16,6 +15,10 @@ loadPrcFileData("", """
|
||||
notify-level-device debug
|
||||
""")
|
||||
|
||||
STICK_DEAD_ZONE = 0.02
|
||||
THROTTLE_DEAD_ZONE = 0.02
|
||||
|
||||
|
||||
class App(ShowBase):
|
||||
def __init__(self):
|
||||
ShowBase.__init__(self)
|
||||
@ -53,24 +56,12 @@ class App(ShowBase):
|
||||
self.accept("flight_stick0-start", exit)
|
||||
|
||||
# Accept button events of the first connected flight stick
|
||||
self.accept("flight_stick0-action_a", self.action, extraArgs=["Action"])
|
||||
self.accept("flight_stick0-action_a-up", self.actionUp)
|
||||
self.accept("flight_stick0-trigger", self.action, extraArgs=["Trigger"])
|
||||
self.accept("flight_stick0-trigger-up", self.actionUp)
|
||||
|
||||
self.environment = loader.loadModel("environment")
|
||||
self.environment.reparentTo(render)
|
||||
|
||||
# save the center position of the stick
|
||||
# NOTE: here we assume, that the stick is centered when the application get started.
|
||||
# In real world applications, you should notice the user and give him enough time
|
||||
# to center the wheel until you store the center position of the controler!
|
||||
self.hcenter = 0
|
||||
self.xcenter = 0
|
||||
self.ycenter = 0
|
||||
if self.flightStick:
|
||||
self.hcenter = self.flightStick.findAxis(InputDevice.Axis.pitch).value
|
||||
self.xcenter = self.flightStick.findAxis(InputDevice.Axis.x).value
|
||||
self.ycenter = self.flightStick.findAxis(InputDevice.Axis.y).value
|
||||
|
||||
# disable pandas default mouse-camera controls so we can handle the camera
|
||||
# movements by ourself
|
||||
self.disableMouse()
|
||||
@ -139,9 +130,10 @@ class App(ShowBase):
|
||||
if self.currentMoveSpeed < 0:
|
||||
self.currentMoveSpeed = 0
|
||||
|
||||
# we will use the first found wheel
|
||||
# Acclerate
|
||||
# Accelerate using the throttle. Apply deadzone of 0.01.
|
||||
throttle = self.flightStick.findAxis(InputDevice.Axis.throttle).value
|
||||
if abs(throttle) < THROTTLE_DEAD_ZONE:
|
||||
throttle = 0
|
||||
accleration = throttle * self.maxAccleration
|
||||
if self.currentMoveSpeed > throttle * self.maxSpeed:
|
||||
self.currentMoveSpeed -= dt * self.deaccleration
|
||||
@ -151,17 +143,26 @@ class App(ShowBase):
|
||||
|
||||
# Control the cameras yaw/Headding
|
||||
stick_yaw = self.flightStick.findAxis(InputDevice.Axis.yaw)
|
||||
base.camera.setH(base.camera, 100 * dt * (stick_yaw.value - self.hcenter))
|
||||
if abs(stick_yaw.value) > STICK_DEAD_ZONE:
|
||||
base.camera.setH(base.camera, 100 * dt * stick_yaw.value)
|
||||
|
||||
# Control the cameras pitch
|
||||
stick_y = self.flightStick.findAxis(InputDevice.Axis.pitch)
|
||||
base.camera.setP(base.camera, 100 * dt * (stick_y.value - self.ycenter))
|
||||
if abs(stick_y.value) > STICK_DEAD_ZONE:
|
||||
base.camera.setP(base.camera, 100 * dt * stick_y.value)
|
||||
|
||||
# Control the cameras roll
|
||||
stick_X = self.flightStick.findAxis(InputDevice.Axis.roll)
|
||||
base.camera.setR(base.camera, 100 * dt * (stick_X.value - self.xcenter))
|
||||
stick_x = self.flightStick.findAxis(InputDevice.Axis.roll)
|
||||
if abs(stick_x.value) > STICK_DEAD_ZONE:
|
||||
base.camera.setR(base.camera, 100 * dt * stick_x.value)
|
||||
|
||||
# calculate movement
|
||||
base.camera.setY(base.camera, dt * self.currentMoveSpeed)
|
||||
|
||||
# Make sure camera does not go below the ground.
|
||||
if base.camera.getZ() < 1:
|
||||
base.camera.setZ(1)
|
||||
|
||||
return task.cont
|
||||
|
||||
app = App()
|
||||
|
Loading…
x
Reference in New Issue
Block a user