def update(self): # clamp while (self.m_azi < -180.0): self.m_azi+= 360.0 while (self.m_azi > 180.0): self.m_azi-= 360.0 if (self.m_ele < -89.0): self.m_ele = -89.0 if (self.m_ele > 89.0): self.m_ele = 89.0 if (self.m_cameraDistance < 0.1): self.m_cameraDistance = 0.1 # calc camera position razi = self.m_azi * 0.01745329251994329547 # rads per deg head=bullet.btQuaternion(self.m_view.up, razi) eyePos=Vector3(0.0, 0.0, -self.m_cameraDistance) forward=Vector3(*eyePos[:]) if (forward.length2() < bullet.SIMD_EPSILON): forward=Vector3(1.0, 0.0, 0.0) right=self.m_view.up.cross(forward) rele = self.m_ele * 0.01745329251994329547 # rads per deg pitch=bullet.btQuaternion(right, -rele) self.m_view.position=self.m_view.target+( bullet.btMatrix3x3(head)*bullet.btMatrix3x3(pitch)).apply(eyePos);
def updateCamera(self): rele = self.m_ele * 0.01745329251994329547;# rads per deg razi = self.m_azi * 0.01745329251994329547;# rads per deg rot=bullet.btQuaternion(self.m_cameraUp, razi); eyePos=[0, 0, 0]; eyePos[self.m_forwardAxis] = -self.m_cameraDistance; eyePos=tuple(eyePos) forward=(eyePos[0], eyePos[1], eyePos[2]); if (vector3.length2(forward) < bullet.SIMD_EPSILON): forward=(1.0, 0.0, 0.0); right = vector3.cross(self.m_cameraUp, forward); roll=bullet.btQuaternion(right,-rele); m=bullet.btMatrix3x3(rot) * bullet.btMatrix3x3(roll) eyePos =m.apply(eyePos); self.m_cameraPosition=vector3.add(eyePos, self.m_cameraTargetPosition); if (self.m_glutScreenWidth == 0 and self.m_glutScreenHeight == 0): return; aspect = float(self.m_glutScreenWidth) / float(self.m_glutScreenHeight); assert(aspect!=0.0) extents=(aspect * 1.0, 1.0, 0.0); if (self.m_ortho): # reset matrix extents *= self.m_cameraDistance; lower = self.m_cameraTargetPosition - extents; upper = self.m_cameraTargetPosition + extents; else: pass
def updateCamera(self): glMatrixMode(GL_PROJECTION); glLoadIdentity(); rele = self.m_ele * 0.01745329251994329547;# rads per deg razi = self.m_azi * 0.01745329251994329547;# rads per deg rot=bullet.btQuaternion(self.m_cameraUp, razi); eyePos=[0, 0, 0]; eyePos[self.m_forwardAxis] = -self.m_cameraDistance; eyePos=tuple(eyePos) forward=(eyePos[0], eyePos[1], eyePos[2]); if (vector3.length2(forward) < bullet.SIMD_EPSILON): forward=(1.0, 0.0, 0.0); right = vector3.cross(self.m_cameraUp, forward); roll=bullet.btQuaternion(right,-rele); m=bullet.btMatrix3x3(rot) * bullet.btMatrix3x3(roll) eyePos =m.apply(eyePos); self.m_cameraPosition=vector3.add(eyePos, self.m_cameraTargetPosition); if (self.m_glutScreenWidth == 0 and self.m_glutScreenHeight == 0): return; aspect = float(self.m_glutScreenWidth) / float(self.m_glutScreenHeight); assert(aspect!=0.0) extents=(aspect * 1.0, 1.0, 0.0); if (self.m_ortho): # reset matrix glLoadIdentity(); extents *= self.m_cameraDistance; lower = self.m_cameraTargetPosition - extents; upper = self.m_cameraTargetPosition + extents; # gluOrtho2D(lower.x, upper.x, lower.y, upper.y); glOrtho(lower.getX(), upper.getX(), lower.getY(), upper.getY(), -1000, 1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); # glTranslatef(100, 210, 0); else: # glFrustum (-aspect, aspect, -1.0, 1.0, 1.0, 10000.0); glFrustum (-aspect * self.m_frustumZNear, aspect * self.m_frustumZNear, -self.m_frustumZNear, self.m_frustumZNear, self.m_frustumZNear, self.m_frustumZFar); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt( self.m_cameraPosition[0], self.m_cameraPosition[1], self.m_cameraPosition[2], self.m_cameraTargetPosition[0], self.m_cameraTargetPosition[1], self.m_cameraTargetPosition[2], self.m_cameraUp[0],self.m_cameraUp[1],self.m_cameraUp[2]);
def renderscene(self, renderpass): rot=bullet.btMatrix3x3(); rot.setIdentity(); m=numpy.array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], 'f') for i, colObj in enumerate(self.m_dynamicsWorld.getCollisionObjectArray()): body=bullet.btRigidBody.upcast(colObj); if(body and body.getMotionState()): myMotionState = bullet.btDefaultMotionState.downcast(body.getMotionState()); _m=myMotionState.m_graphicsWorldTrans.getOpenGLMatrix(); rot=myMotionState.m_graphicsWorldTrans.getBasis(); else: _m=colObj.getWorldTransform().getOpenGLMatrix(); rot=colObj.getWorldTransform().getBasis(); for j, v in enumerate(_m): m[j]=v state=colObj.getActivationState() if(i&1): # odd if state==1: # active wireColor=(1.0, 0.0, 1.0); elif state==2: # ISLAND_SLEEPING wireColor=(0.0, 1.0, 1.0); else: wireColor=(0.0, 0.0, 1.0); else: # even # color differently for active, sleeping, wantsdeactivation states if state==1: # active wireColor=(1.5, 1.0, 0.5); elif state==2: # ISLAND_SLEEPING wireColor=(1.0, 1.5, 0.5); else: wireColor=(1.0, 1.0, 0.5); # wants deactivation aabbMin, aabbMax=self.m_dynamicsWorld.getBroadphase().getBroadphaseAabb(); vector3.sub(aabbMin, ( bullet.BT_LARGE_FLOAT, bullet.BT_LARGE_FLOAT, bullet.BT_LARGE_FLOAT)); vector3.sub(aabbMax, ( bullet.BT_LARGE_FLOAT, bullet.BT_LARGE_FLOAT, bullet.BT_LARGE_FLOAT)); if (not (self.getDebugMode() & bullet.btIDebugDraw.DBG_DrawWireframe)): if renderpass==0: self.m_shapeDrawer.drawOpenGL(m, colObj.getCollisionShape(), wireColor, self.getDebugMode(), aabbMin, aabbMax); elif renderpass==1: self.m_shapeDrawer.drawShadow(m, rot.apply(self.m_sundirection), colObj.getCollisionShape(), aabbMin,aabbMax); elif renderpass==2: self.m_shapeDrawer.drawOpenGL(m, colObj.getCollisionShape(), vector3.mul(wireColor, 0.3), 0, aabbMin, aabbMax);