Пример #1
0
    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);
Пример #2
0
    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
Пример #3
0
    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]);
Пример #4
0
    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);