I’m having a similar issue, but my code is different than his. I’m trying to get the player to rotate, in terms of XYZ coordinates, left or right, based on whether the mouse position is not in center (300, 300).
I do not know if Quat could solve this issue. My code is down below and are in snipplets:
from direct.showbase.ShowBase import ShowBase
from direct.task import Task
from panda3d.core import AmbientLight
from panda3d.core import DirectionalLight
from panda3d.core import Vec4, Vec3, Vec2
from panda3d.core import CollisionBox, CollisionNode
from panda3d.core import TextureStage
from panda3d.core import WindowProperties
from panda3d.core import MouseButton
from panda3d.core import Point3
from panda3d.core import Filename
from panda3d.core import CompassEffect
from panda3d.bullet import BulletWorld
from panda3d.bullet import BulletPlaneShape
from panda3d.bullet import BulletRigidBodyNode
from panda3d.bullet import BulletBoxShape
from panda3d.bullet import BulletCharacterControllerNode
from panda3d.bullet import BulletCapsuleShape
from panda3d.bullet import ZUp
from panda3d.core import BitMask32
from panda3d.core import Quat
import sys, os
from math import pi, sin, cos
class Game(ShowBase):
def __init__(self):
super().__init__()
# -snip-
# Variables
## Boolean to test the in-game camera
setCameraTest = True
self.heading = 0
self.pitch = 0
self.oldMouseX = 300
self.oldMouseY = 300
###
# -snip-
# Setting up an object in Bullet Physics engine
# Setting up a world in Bullet Physics engine
self.world = BulletWorld()
self.world.setGravity(Vec3(0, 0, -9.81))
shape = BulletBoxShape(Vec3(30, 30, 30))
node = BulletRigidBodyNode('World')
node.addShape(shape)
self.worldNP = render.attachNewNode(node)
###
# -snip-
# Setting up a player
## Player's variables
height = 1.75
radius = 0.4
shape = BulletCapsuleShape(radius, height - 2*radius, ZUp)
## Setting the player in Bullet Physics universe
self.playerNode = BulletCharacterControllerNode(shape, 0.4, 'Player')
playerNP = self.worldNP.attachNewNode(self.playerNode)
playerNP.setPos(-2, 0, 14)
playerNP.setCollideMask(BitMask32.allOn())
self.world.attachCharacter(playerNP.node())
## Setting the player in visual universe
### Setting up a texture for the player
playerBack = loader.loadTexture(mydir + "/characters/player/imgPlayer0.png")
self.player = loader.loadModel(mydir + "/characters/charBase")
####
# Use 0, 5, 0 as a way to test gravity. #
# Otherwise 0, 5, -0.07 for ground movement. #
self.player.flattenLight()
self.player.setTexture(playerBack)
self.player.setTransparency(True)
self.player.setPos(0, 5, -0.07)
self.player.setScale(0.1, 0.1, 0.1)
self.player.reparentTo(render)
self.player.setBillboardAxis()
### Things that relates to player
self.playerKeyControl = {
"up" : False,
"down" : False,
"left" : False,
"right" : False}
####
###
# Camera
if setCameraTest:
base.disableMouse()
props = WindowProperties()
props.setCursorHidden(True)
base.win.requestProperties(props)
self.dummyParentCamera = render.attachNewNode('dummyCamera')
self.dummyParentCamera.reparentTo(self.player)
self.dummyParentCamera.setEffect(CompassEffect.make(render))
self.camera.reparentTo(self.dummyParentCamera)
self.camera.setY(-50)
self.camera.lookAt(self.dummyParentCamera)
self.taskMgr.add(self.MouseDebug, "MouseDebug")
# Tasks to add
taskMgr.add(self.CheckControl, 'CheckControl')
taskMgr.add(self.update, 'update')
###
def CheckControl(self, task):
base.accept('w', self.UpdateControl, ["up", True])
base.accept('w-up', self.UpdateControl, ["up", False])
base.accept('s', self.UpdateControl, ["down", True])
base.accept('s-up', self.UpdateControl, ["down", False])
base.accept('a', self.UpdateControl, ["left", True])
base.accept('a-up', self.UpdateControl, ["left", False])
base.accept('d', self.UpdateControl, ["right", True])
base.accept('d-up', self.UpdateControl, ["right", False])
return task.cont
def MouseDebug(self, task):
md = base.win.getPointer(0)
x = md.getX()
y = md.getY()
if base.win.movePointer(0, 300, 300):
self.heading = self.heading - (x - 300) * 0.5
self.pitch = self.pitch - (y - 300) * 0.5
####### This is the code where I am trying to apply forward rotation #######
if self.oldMouseX != x and self.playerKeyControl["up"]:
if self.oldMouseX < x:
self.player.setPos(self.player.getPos() + Vec3(0.01, 0, 0))
else:
self.player.setPos(self.player.getPos() + Vec3(-0.01, 0, 0))
self.dummyParentCamera.setHpr(self.heading, self.pitch, 0)
base.accept('wheel_up', lambda : base.camera.setY(base.camera.getY() + 200 * globalClock.getDt()))
base.accept('wheel_down', lambda : base.camera.setY(base.camera.getY() - 200 * globalClock.getDt()))
return Task.cont
def UpdateControl(self, controlName, controlState):
self.playerKeyControl[controlName] = controlState
def update(self, task):
md = base.win.getPointer(0)
dt = globalClock.getDt()
self.world.doPhysics(dt, 10, 1.0/180.0)
if self.playerKeyControl["up"]:
self.player.setPos(self.player.getPos() + Vec3(0, 5.0 * dt, 0))
if self.playerKeyControl["down"]:
self.player.setPos(self.player.getPos() + Vec3(0, -5.0 * dt, 0))
if self.playerKeyControl["left"]:
self.player.setPos(self.player.getPos() + Vec3(-5.0 * dt, 0, 0))
if self.playerKeyControl["right"]:
self.player.setPos(self.player.getPos() + Vec3(5.0 * dt, 0, 0))
self.oldMouseX = md.getX()
self.oldMouseY = md.getY()
return task.cont
game = Game()
game.run()