Exemple #1
0
    def shootBoxFromAbove(self):
        dest = dk.Vector3(self.carChassis.worldTransform().position)
        start = dk.Vector3(dest.x, dest.y + 100, dest.z)
        dest.x += ((dk.random() % 10) / 5.0 - 1.0) * 5.0
        dest.z += ((dk.random() % 10) / 5.0 - 1.0) * 5.0
        self.shootBox(start, dest, 20)

        self.autoShootingCount += 1
        if self.autoShootingCount > self.shootingObjects:
            self.autoShooting = None
Exemple #2
0
    def resetCamera(self, *args):
        carTrans = self.carChassis.worldTransform()
        pos = dk.Vector3(0, 20, -20)
        pos.transform(carTrans)
        target = dk.Vector3(carTrans.position)
        self.cameraInfo.target = target
        self.camera.setView(pos, target - pos, dk.Vector3(0, 1, 0))
        self.updatePerspective()

        print('pos3: ', pos)
        print('target3: ', target)
Exemple #3
0
 def __init__(self, *args, **kwargs):
     super().__init__(*args, **kwargs)
     self.backgroundColor = dk.Color(0.6, 0.8, 1.0)
     self.camera = dk.Camera()
     self.cameraInfo = CameraInfo(fov=math.radians(80),
                                  near=4.0,
                                  far=1000.0,
                                  aspect=1.0,
                                  target=dk.Vector3(0, 0, 0))
     pos = dk.Vector3(0, 20, -20)
     up = dk.Vector3(0, 1, 0)
     self.camera.setView(pos, self.cameraInfo.target - pos, up)
     self.steering = 0
Exemple #4
0
    def onMouseMove(self, deviceId, pos, delta):
        super().onMouseMove(deviceId, pos, delta)

        if self.isMouseCapturedBySelf(deviceId):

            moveCamera = deviceId == 0 and (0, 0) in self.mouseDown
            moveLight = deviceId == 1 or (0, 1) in self.mouseDown

            if moveCamera or moveLight:
                dir = self.camera.direction()
                # up = self.camera.up()
                up = dk.Vector3(0, 1, 0)
                left = dir.cross(up)

                dX = delta.x * 0.01
                dY = delta.y * 0.01

                qY = dk.Quaternion(up, -dX)
                qX = dk.Quaternion(left, dY)
                rot = qX * qY

                if moveCamera:  # camera move
                    pos = self.camera.position() - self.cameraInfo.target
                    pos.transform(rot)
                    pos += self.cameraInfo.target
                    self.camera.setView(pos, self.cameraInfo.target - pos, up)
                else:  # light move
                    light = self.scene.lights[0]
                    dir = light.direction()
                    rot.inverse()
                    dir.transform(rot)
                    light.setDirection(dir)
                    self.scene.updateLights()
Exemple #5
0
    def onMouseMove(self, deviceId, pos, delta):
        super().onMouseMove(deviceId, pos, delta)
        if deviceId == 0:
            if self.isMouseCapturedBySelf(deviceId):
                camera = self.camera if not self.inspectMode else self.inspectCamera

                dir = camera.direction()
                #up = self.camera.up()
                up = dk.Vector3(0,1,0)
                left = dir.cross(up)

                dX = delta.x * 0.01
                dY = delta.y * 0.01

                qY = dk.Quaternion(up, -dX)
                qX = dk.Quaternion(left, dY)
                rot = qX * qY

                pos = camera.position() - self.cameraInfo.target
                pos.transform(rot)
                pos += self.cameraInfo.target
                # minY = self.cameraInfo.target.y + self.cameraInfo.near + 2
                # if pos.y < minY: pos.y = minY
                if not self.inspectMode:
                    pos.y = max(pos.y, self.cameraInfo.target.y)
                camera.setView(pos, self.cameraInfo.target - pos, up)
Exemple #6
0
    def onUpdate(self, delta, tick, date):
        super().onUpdate(delta, tick, date)

        engineForce = 0.0
        brakeForce = 0.0

        window = self.screen().window

        if self.brakeButton.activated or window.isKeyDown(0, dk.vkey.DOWN):
            brakeForce = 100.0
        elif self.accelButton.activated or window.isKeyDown(0, dk.vkey.UP):
            engineForce = 3000.0

        if not self.steerSlider.isActivated():
            steerOffset = 0.0
            if window.isKeyDown(0, dk.vkey.LEFT):
                steerOffset -= delta * 0.7
            elif window.isKeyDown(0, dk.vkey.RIGHT):
                steerOffset += delta * 0.7

            steerValue = self.steerSlider.value
            if steerOffset != 0.0:
                steerValue += steerOffset
            else:
                if steerValue > 0.0:
                    steerValue -= delta * 0.3
                    if steerValue < 0.0: steerValue = 0.0
                elif steerValue < 0.0:
                    steerValue += delta * 0.3
                    if steerValue > 0.0: steerValue = 0.0
            self.steerSlider.setValue(steerValue)

        self.vehicle.setSteeringValue(self.steering, 0)
        self.vehicle.setSteeringValue(self.steering, 1)

        self.vehicle.applyEngineForce(engineForce, 2)
        self.vehicle.applyEngineForce(engineForce, 3)

        self.vehicle.setBrake(brakeForce, 2)
        self.vehicle.setBrake(brakeForce, 3)

        self.scene.update(delta, tick)

        numWheels = len(self.vehicle.wheels)
        self.wheelTrans = [None] * numWheels
        for i in range(numWheels):
            wheel = self.vehicle.wheels[i]
            self.vehicle.updateWheelTransform(wheel)
            self.wheelTrans[i] = wheel.worldTransform

        self.cameraInfo.target = dk.Vector3(
            self.carChassis.worldTransform().position)
        self.updateView()

        self.infoLabel.text = ' Elapsed: {0:.6f} ({1:.2f} FPS) {2[0]:.0f}x{2[1]:.0f}'.format(
            delta, 1.0 / delta, self.contentResolution)
        self.infoLabel.redraw()

        self.redraw()
Exemple #7
0
    def shootBox(self, start, destination, speed=30):

        n = dk.random() % len(self.shootingShapes)

        box = createRigidBody(50.0,
                              self.shootingShapes[n],
                              start,
                              name='a box')
        box.setLinearFactor(dk.Vector3(1, 1, 1))
        linVel = destination - start
        linVel.normalize()
        linVel *= speed

        box.setLinearVelocity(linVel)
        box.setAngularVelocity(dk.Vector3(0, 0, 0))

        self.scene.addObject(box)
Exemple #8
0
    def __init__(self, *args, **kw):
        super().__init__(*args, **kw)

        self.cameraInfo = CameraInfo()
        self.cameraInfo.target = dk.Vector3(0, 1000, 0)

        self.camera = dk.Camera()
        self.inspectCamera = dk.Camera()

        pos = dk.Vector3(0, 1000, -1700)
        self.camera.setView(pos, self.cameraInfo.target - pos, dk.Vector3(0, 1, 0))
        self.inspectCamera.setView(pos, self.cameraInfo.target - pos, dk.Vector3(0, 1, 0))

        self.backgroundColor = dk.Color(0.85, 0.85, 1.0)
        self.inspectMode = False
        self.shadowMapInfo = ShadowMapInfo()
        self.shadowMapInfo.type = SHADOW_MAP_LISPSM
Exemple #9
0
def createRigidBody(mass, shape, transform=dk.NSTransform(), name=''):
    if mass == 0.0:
        localInertia = dk.Vector3(0, 0, 0)
    else:
        localInertia = shape.calculateLocalInertia(mass)

    rb = dk.RigidBody(shape, mass, localInertia)
    rb.setWorldTransform(transform)
    rb.name = name
    return rb
Exemple #10
0
 def __init__(self,
              fov=math.radians(80.0),
              near=10.0,
              far=100.0,
              aspect=1.0,
              target=dk.Vector3(0, 0, 0)):
     self.fov = fov
     self.near = near
     self.far = far
     self.aspect = aspect
     self.target = target
Exemple #11
0
    def onMouseUp(self, deviceId, buttonId, pos):
        super().onMouseUp(deviceId, buttonId, pos)
        if deviceId == 0:
            if self.isMouseCapturedBySelf(deviceId):
                self.releaseMouse(deviceId)
        if deviceId == 1 or buttonId == 1:
            x = (pos.x / self.contentScale[0]) * 2.0 - 1.0
            y = (pos.y / self.contentScale[1]) * 2.0 - 1.0

            viewProjInv = self.camera.viewMatrix() * self.camera.projectionMatrix()
            viewProjInv.inverse()

            rayBegin = dk.Vector3(x, y, -1.0)
            rayEnd = dk.Vector3(x, y, 1.0)

            rayBegin.transform(viewProjInv)
            rayEnd.transform(viewProjInv)

            # target = self.cameraInfo.target
            self.shootBox(rayBegin, rayEnd)
            print('shooting Box!!')
Exemple #12
0
    def onLoaded(self):
        super().onLoaded()
        self.backgroundColor = dk.Color(0.25, 0.25, 0.25)

        self.infoLabel = dk.ui.Label(' Left-Click: camera move, Right-Click: Shoot box (Second touch on mobile)')
        self.infoLabel.fontAttributes = dk.ui.font.attributes(14, outline=2)
        self.infoLabel.align = dk.ui.label.ALIGN_LEFT
        self.infoLabel.setBlendState(dk.blendstate.defaultAlpha)
        self.infoLabel.backgroundColor = dk.color.clear
        self.infoLabel.textColor = dk.color.white
        self.infoLabel.outlineColor = dk.color.black
        self.infoLabel.enabled = False
        self.addChild(self.infoLabel)

        # 슈팅 박스
        self.shootingShapes = (dk.BoxShape(0.85, 0.85, 0.85),
                               dk.BoxShape(1.0, 1.0, 1.0),
                               dk.BoxShape(2.0, 1.0, 2.0),
                               dk.CylinderShape(1.0, 1.0, 1.0),
                               dk.CylinderShape(1.5, 0.5, 1.5),
                               dk.SphereShape(1.0))

        self.resourcePool = dk.ResourcePool()
        self.resourcePool.addSearchPath(dk.appInstance().resourceDir + "/dao")

        # 씬 생성
        self.model = self.resourcePool.loadResource('dao.DKMODEL')
        animaiton = self.resourcePool.loadResource('dao.DKANIMATION')
        animControl = animaiton.createLoopController()
        animControl.play()
        self.model.setAnimation(animControl)

        self.scene = dk.DynamicsScene()
        self.scene.drawMode = dk.scene.DRAW_COLLISION_SHAPES | dk.scene.DRAW_MESHES
        self.scene.ambientColor = dk.Color(0.45, 0.45, 0.45)
        self.scene.lights.append(dk.light.directional(dk.Vector3(0, -1, 0), dk.Color(1, 1, 1)))
        self.scene.updateLights()
        self.scene.addObject(self.model)

        # 바닥 객체 생성
        groundShape = dk.StaticPlaneShape(dk.Vector3(0, 1, 0), 0)
        groundObject = createRigidBody(0, groundShape, dk.Vector3(0, 0, 0), 'groundObject')
        self.scene.addObject(groundObject)

        # 카메라 초기화.
        self.camera = dk.Camera()
        self.cameraInfo = CameraInfo(fov=math.radians(80),
                                     near=1.0,
                                     far=1000.0,
                                     aspect=1.0,
                                     target=dk.Vector3(0, 5, 0))
        pos = dk.Vector3(0, 10, -20)
        up = dk.Vector3(0, 1, 0)
        self.camera.setView(pos, self.cameraInfo.target - pos, up)
Exemple #13
0
 def updateView(self):
     pos = self.camera.position()
     #up = self.camera.up()
     up = dk.Vector3(0, 1, 0)
     dir = self.cameraInfo.target - pos
     self.camera.setView(pos, dir, up)
Exemple #14
0
    def onLoaded(self):
        super().onLoaded()
        self.backgroundColor = dk.Color(0.22, 0.32, 1.0)

        charMenu = dk.ui.Menu()
        c1 = charMenu.addItem('Character 1')
        c1.filename = 'dil.DKMODEL'
        c1.callback = self.loadCharacter
        c2 = charMenu.addItem('Character 2')
        c2.filename = 'dih.DKMODEL'
        c2.callback = self.loadCharacter
        c3 = charMenu.addItem('Character 3')
        c3.filename = 'kon.DKMODEL'
        c3.callback = self.loadCharacter
        self.charMenuItems = [c1, c2, c3]

        animMenu = dk.ui.Menu()
        a1 = animMenu.addItem('Walk')
        a1.animIndex = 0
        a1.callback = self.changeAnimation
        a2 = animMenu.addItem('Run')
        a2.animIndex = 1
        a2.callback = self.changeAnimation
        a3 = animMenu.addItem('Attack')
        a3.animIndex = 2
        a3.callback = self.changeAnimation
        self.animMenuItems = [a1, a2, a3]

        speedMenu = dk.ui.Menu()
        s1 = speedMenu.addItem('0.5')
        s1.animSpeed = 0.5
        s1.callback = self.changeAnimationSpeed
        s2 = speedMenu.addItem('1.0')
        s2.animSpeed = 1.0
        s2.callback = self.changeAnimationSpeed
        s3 = speedMenu.addItem('2.0')
        s3.animSpeed = 2.0
        s3.callback = self.changeAnimationSpeed
        speedMenu.addSeparator()
        speedMenu.addItem('Reverse').enabled = False
        s4 = speedMenu.addItem('-0.5')
        s4.animSpeed = -0.5
        s4.callback = self.changeAnimationSpeed
        s5 = speedMenu.addItem('-1.0')
        s5.animSpeed = -1.0
        s5.callback = self.changeAnimationSpeed
        s6 = speedMenu.addItem('-2.0')
        s6.animSpeed = -2.0
        s6.callback = self.changeAnimationSpeed
        self.animSpeedItems = [s1, s2, s3, s4, s5, s6]

        ctrlMenu = dk.ui.Menu()
        animPlayStopMenuItem = ctrlMenu.addItem('Play')
        animPlayStopMenuItem.playing = False
        animPlayStopMenuItem.callback = self.togglePlayStop
        ctrlMenu.addSeparator()
        ctrlMenu.addItem('Speed').subMenu = speedMenu

        self.menuBar = dk.ui.Menu()
        self.menuBar.addItem('Models').subMenu = charMenu
        self.menuBar.addSeparator()
        self.menuBar.addItem('Animations').subMenu = animMenu
        self.menuBar.addSeparator()
        self.menuBar.addItem('Control').subMenu = ctrlMenu
        self.menuBar.addSeparator()

        self.addChild(self.menuBar)

        self.infoLabel = dk.ui.Label(
            ' left-click: camera, right-click: light (two fingers move on mobile)'
        )
        self.infoLabel.fontAttributes = dk.ui.font.attributes(14, outline=2)
        self.infoLabel.align = dk.ui.label.ALIGN_LEFT
        self.infoLabel.setBlendState(dk.blendstate.defaultAlpha)
        self.infoLabel.backgroundColor = dk.color.clear
        self.infoLabel.textColor = dk.color.white
        self.infoLabel.outlineColor = dk.color.black
        self.infoLabel.enabled = False
        self.addChild(self.infoLabel)

        self.resourcePool = dk.ResourcePool()
        self.resourcePool.addSearchPath(dk.appInstance().resourceDir +
                                        "/knights")

        # create scene
        self.scene = dk.Scene()
        self.character = None
        self.sword = self.resourcePool.loadResource('katana.DKMODEL')
        self.animations = [
            self.resourcePool.loadResource('walk.DKANIMATION'),
            self.resourcePool.loadResource('run.DKANIMATION'),
            self.resourcePool.loadResource('attack.DKANIMATION'),
        ]
        self.animControl = None

        self.scene.ambientColor = dk.Color(0.45, 0.45, 0.45)
        self.scene.lights.append(
            dk.light.directional(dk.Vector3(0, -1, 0), dk.Color(1, 1, 1)))
        self.scene.updateLights()

        # init camera
        self.camera = dk.Camera()
        self.cameraInfo = CameraInfo(fov=math.radians(80),
                                     near=10.0,
                                     far=1000.0,
                                     aspect=1.0,
                                     target=dk.Vector3(0, 80, 0))
        pos = dk.Vector3(0, 100, 120)
        up = dk.Vector3(0, 1, 0)
        self.camera.setView(pos, self.cameraInfo.target - pos, up)

        self.changeAnimation(self.animMenuItems[0])
        self.togglePlayStop(animPlayStopMenuItem)
        self.changeAnimationSpeed(self.animSpeedItems[1])
        self.screen().postOperation(self.loadCharacter,
                                    (self.charMenuItems[2], ))
Exemple #15
0
 def resetScene(self):
     self.vehicleSteering = 0.0
     self.carChassis.setLinearVelocity(dk.Vector3(0, 0, 0))
     self.carChassis.setAngularVelocity(dk.Vector3(0, 0, 0))
Exemple #16
0
    def onLoaded(self):
        super().onLoaded()

        bounds = self.bounds()

        # slider for light direction
        sliderX = dk.ui.Slider(0, range=(-1.5, 1.5), frame=dk.Rect(0, 100, 200, 40))
        sliderZ = dk.ui.Slider(0, range=(-1.5, 1.5), frame=dk.Rect(0, 150, 40, 200))
        sliderZ.vertical = True
        sliderX.vectorIndex = 0
        sliderZ.vectorIndex = 2
        sliderX.addTarget(self, self.onSliderValueChanged)
        sliderZ.addTarget(self, self.onSliderValueChanged)
        self.addChild(sliderX)
        self.addChild(sliderZ)

        shadowConfigWindow = dk.ui.TitledView('Config')
        origin = shadowConfigWindow.contentBounds().origin

        resWidth = 100
        typeWidth = 120
        itemHeight = 30

        resolutions = (0, 512)
        r = resolutions[-1]
        maxTexSize = dk.texture.maxTextureSize()
        while r < maxTexSize:
            r = r * 2
            resolutions = resolutions + (r,)

        # resolution radio-button rect
        resRect = dk.Rect(origin[0], origin[1], resWidth, len(resolutions) * itemHeight)

        configHeight = max(resRect.height, itemHeight*5)
        resRect.y = origin[1] + configHeight - resRect.height

        # shadow-type radio-button rect
        typeRect = dk.Rect(resRect.x + resRect.width, 0, typeWidth, itemHeight*2)
        typeRect.y = origin[1] + configHeight - typeRect.height

        # shadow-body-vector checkbox rect
        bvRect = dk.Rect(resRect.x + resRect.width, 0, typeWidth, itemHeight)
        bvRect.y = typeRect.y - bvRect.height

        # multi-sample checkbox rect
        msRect = dk.Rect(resRect.x + resRect.width, 0, typeWidth, itemHeight)
        msRect.y = bvRect.y - msRect.height

        # inspect-mode checkbox rect
        imRect = dk.Rect(resRect.x + resRect.width, 0, typeWidth, itemHeight)
        imRect.y = msRect.y - msRect.height

        frame = shadowConfigWindow.frameForContentFrame(dk.Rect(0, 0, resWidth+typeWidth, configHeight ))
        frame.origin = bounds.width - frame.width, bounds.height - frame.height
        shadowConfigWindow.frame = frame

        for btn, val in zip(
                dk.ui.radio.addItems(shadowConfigWindow, resolutions, resRect, columns=1),
                resolutions):
            btn.value = val
            btn.addTarget(self, self.onShadowResolutionChanged)
            btn.backgroundColor = dk.color.clear
            btn.setBlendState(dk.blendstate.defaultAlpha)

        for btn, val in zip(
                dk.ui.radio.addItems(shadowConfigWindow, ('Uniform', 'LiSPSM'), typeRect, columns=1),
                (SHADOW_MAP_UNIFORM, SHADOW_MAP_LISPSM)):
            btn.value = val
            if val == self.shadowMapInfo.type:
                btn.setSelected()
            btn.addTarget(self, self.onShadowTypeChanged)
            btn.backgroundColor = dk.color.clear
            btn.setBlendState(dk.blendstate.defaultAlpha)

        cb = dk.ui.Checkbox('B-Vector', value=True, frame=bvRect)
        cb.addTarget(self, self.onShadowBVectorValueChanged)
        cb.backgroundColor = dk.color.clear
        cb.setBlendState(dk.blendstate.defaultAlpha)
        shadowConfigWindow.addChild(cb)
        cb = dk.ui.Checkbox('Multi-Sample', value=False, frame=msRect)
        cb.addTarget(self, self.onShadowMultiSampleValueChanged)
        cb.backgroundColor = dk.color.clear
        cb.setBlendState(dk.blendstate.defaultAlpha)
        shadowConfigWindow.addChild(cb)
        cb = dk.ui.Checkbox('Inspect', value=False, frame=imRect)
        cb.addTarget(self, self.onShadowInspdeModeValueChanged)
        cb.backgroundColor = dk.color.clear
        cb.setBlendState(dk.blendstate.defaultAlpha)
        shadowConfigWindow.addChild(cb)
        shadowConfigWindow.backgroundColor = dk.Color(1.0, 1.0, 1.0, 0.9)
        shadowConfigWindow.setBlendState(dk.blendstate.defaultAlpha)
        self.addChild(shadowConfigWindow)

        # info labels
        self.infoLabel = dk.ui.Label()
        self.infoLabel.fontAttributes = dk.ui.font.attributes(18)
        self.infoLabel.align = dk.ui.label.ALIGN_LEFT
        self.infoLabel.backgroundColor = dk.Color(0.0, 0.0, 0.0, 0.3)
        self.infoLabel.textColor = dk.Color(1.0, 1.0, 1.0, 1.0)
        self.infoLabel.outlineColor = dk.Color(0.0, 0.0, 0.0, 1.0)
        self.infoLabel.setBlendState(dk.blendstate.defaultAlpha)
        self.infoLabel.enabled = False
        self.addChild(self.infoLabel)

        self.screen().postOperation(self.layout, ())

        # load model
        resourcePool = dk.ResourcePool()
        resourcePool.addSearchPath(dk.appInstance().resourceDir + '/desert')

        self.scene = dk.Scene()
        self.model = resourcePool.loadResource('desert.DKMODEL')
        self.scene.addObject(self.model)
        self.scene.ambientColor = dk.Color(0.1, 0.1, 0.1)
        self.scene.lights.append(dk.light.directional(dk.Vector3(0, -1, 0), dk.Color(1, 1, 1)))
        self.scene.updateLights()

        # calculate aabb
        def calcAABB(model, aabb):
            if isinstance(model, dk.Mesh):
                aabbMin, aabbMax = model.aabb()
                if aabbMin.x < aabb.min.x:  aabb.min.x = aabbMin.x
                if aabbMin.y < aabb.min.y:  aabb.min.y = aabbMin.y
                if aabbMin.z < aabb.min.z:  aabb.min.z = aabbMin.z
                if aabbMax.x > aabb.max.x:  aabb.max.x = aabbMax.x
                if aabbMax.y > aabb.max.y:  aabb.max.y = aabbMax.y
                if aabbMax.z > aabb.max.z:  aabb.max.z = aabbMax.z
            for c in model.children():
                calcAABB(c, aabb)

        aabb = dk.shadow.AABB(dk.Vector3(0, 0, 0), dk.Vector3(0, 0, 0))
        print('calculating scene AABB...')
        calcAABB(self.model, aabb)
        print('AABB: ', aabb)
        self.shadowMapInfo.aabb = aabb

        # generate box polygon mesh
        decl = dk.geometry.VertexBufferDecl()
        decl.add(dk.geometry.STREAM_ID.POSITION, 'position', dk.geometry.STREAM_TYPE.FLOAT3)
        data = array.array('f')
        data.extend(( 1.0,  1.0, -1.0))   # near right top
        data.extend(( 1.0, -1.0, -1.0))   # near right bottom
        data.extend((-1.0, -1.0, -1.0))   # near left bottom
        data.extend((-1.0,  1.0, -1.0))   # near left top
        data.extend(( 1.0,  1.0,  1.0))   # far right top
        data.extend(( 1.0, -1.0,  1.0))   # far right bottom
        data.extend((-1.0, -1.0,  1.0))   # far left bottom
        data.extend((-1.0,  1.0,  1.0))   # far left top

        faceIndices = (2,1,3,0,7,4,6,5,        # 2,1,3 / 3,1,0 / 3,0,7 / 7,0,4 / 7,4,6 / 6,4,5
                   5,4,
                   4,0,5,1,6,2,7,3)        # 4,0,5 / 5,0,1 / 5,1,6 / 6,1,2 / 6,2,7 / 7,2,3

        lineIndices = (0,1,1,2,2,3,3,0,0,4,4,5,5,1,3,7,7,6,6,2,6,5,7,4)

        vb = dk.geometry.createVertexBuffer(decl, data, 8)
        faceIb = dk.geometry.createIndexBuffer(faceIndices, dk.geometry.PRIMITIVE_TRIANGLE_STRIP)
        lineIb = dk.geometry.createIndexBuffer(lineIndices, dk.geometry.PRIMITIVE_LINES)

        inspectMaterial = resourcePool.loadResource('inspect.DKMATERIAL')
        inspectFaceMesh = dk.StaticMesh()
        # inspectFaceMesh.drawFace = dk.mesh.DRAW_FACE_CCW
        inspectFaceMesh.drawFace = dk.mesh.DRAW_FACE_BOTH
        inspectFaceMesh.setMaterial(inspectMaterial)
        inspectFaceMesh.addVertexBuffer(vb)
        inspectFaceMesh.setIndexBuffer(faceIb)

        inspectLineMesh = dk.StaticMesh()
        inspectLineMesh.drawFace = dk.mesh.DRAW_FACE_BOTH
        inspectLineMesh.setMaterial(inspectMaterial)
        inspectLineMesh.addVertexBuffer(vb)
        inspectLineMesh.setIndexBuffer(lineIb)

        # inspect mode items.
        self.inspectScene = dk.Scene()
        self.cameraFrustumFaceMesh = inspectFaceMesh.clone()
        self.shadowFrustumFaceMesh = inspectFaceMesh.clone()
        self.cameraFrustumLineMesh = inspectLineMesh.clone()
        self.shadowFrustumLineMesh = inspectLineMesh.clone()

        self.cameraFrustumFaceMesh.setMaterialProperty('color', floatings=dk.Color(1,0,0,0.1).tuple)
        self.shadowFrustumFaceMesh.setMaterialProperty('color', floatings=dk.Color(0,0,1,0.1).tuple)
        self.cameraFrustumLineMesh.setMaterialProperty('color', floatings=dk.Color(1,1,1).tuple)
        self.shadowFrustumLineMesh.setMaterialProperty('color', floatings=dk.Color(1,1,1).tuple)

        self.inspectScene.addObject(self.cameraFrustumFaceMesh)
        self.inspectScene.addObject(self.shadowFrustumFaceMesh)
        self.inspectScene.addObject(self.cameraFrustumLineMesh)
        self.inspectScene.addObject(self.shadowFrustumLineMesh)
Exemple #17
0
    def onLoaded(self):
        super().onLoaded()

        resourceDir = dk.appInstance().resourceDir
        self.resourcePool = dk.ResourcePool()

        # self.resourcePool.addSearchPath(resourceDir)
        self.resourcePool.addSearchPath(resourceDir)

        # create simulator scene
        self.scene = dk.DynamicsScene()
        self.scene.setAmbientColor(dk.color.white)
        self.scene.lights = [
            dk.light.directional(dk.Vector3(-1, -1, -1), dk.Color(1, 1, 1))
        ]
        self.scene.updateLights()
        # self.scene.setDrawMode(dk.scene.DRAW_MESHES, dk.scene.DRAW_COLLISION_SHAPES)
        self.scene.drawMode = dk.scene.DRAW_COLLISION_SHAPES
        self.scene.lights.append(dk.Light())

        # ground object
        groundShape = dk.BoxShape(500, 100, 500)
        self.groundObject = createRigidBody(0, groundShape,
                                            dk.Vector3(0, -100, 0),
                                            'groundObject')

        self.scene.addObject(self.groundObject)

        # vehicle chassis
        chassisShape = dk.CompoundShape()
        chassisShape.addChild(dk.BoxShape(1, 0.5, 2), dk.Vector3(0, 1, 0))
        chassisShape.addChild(dk.BoxShape(0.85, 0.3, 0.9),
                              dk.Vector3(0, 1.8, -0.3))

        self.carChassis = createRigidBody(800,
                                          chassisShape,
                                          name='car chassis')
        #self.carChassis.setWorldTransform(dk.NSTransform(dk.Quaternion(dk.Vector3(0,0,1), math.pi * 0.3), dk.Vector3(0,10,0)))

        self.scene.addObject(self.carChassis)

        self.resetScene()

        # vehicle object
        self.vehicle = dk.controller.Vehicle(self.carChassis)
        self.carChassis.keepActivating(True)

        # add vehicle into scene
        self.scene.addObject(self.vehicle)

        WHEEL_WIDTH = 0.4
        WHEEL_RADIUS = 0.5

        # wheel shape
        wheelShape = dk.CylinderShape(WHEEL_WIDTH, WHEEL_RADIUS, WHEEL_RADIUS,
                                      dk.collisionshape.UP_AXIS_LEFT)
        self.wheelShape = wheelShape
        self.wheelTrans = []

        CONNECTION_HEIGHT = 1.2
        CUBE_HALF_EXTENTS = 1.0

        suspensionResetLength = 0.6
        wheelDirectionCS0 = dk.Vector3(0, -1, 0)
        wheelAxleCS = dk.Vector3(-1, 0, 0)

        tunning = {
            'suspensionStiffness': 20.0,
            'suspensionDamping': 2.3,
            'suspensionCompression': 4.4,
            'frictionSlip': 1000.0,
            'rollInfluence': 0.1
        }

        xvalues = (CUBE_HALF_EXTENTS - (0.3 * WHEEL_WIDTH),
                   -CUBE_HALF_EXTENTS + (0.3 * WHEEL_WIDTH),
                   -CUBE_HALF_EXTENTS + (0.3 * WHEEL_WIDTH),
                   CUBE_HALF_EXTENTS - (0.3 * WHEEL_WIDTH))
        zvalues = (2 * CUBE_HALF_EXTENTS - WHEEL_RADIUS,
                   2 * CUBE_HALF_EXTENTS - WHEEL_RADIUS,
                   -2 * CUBE_HALF_EXTENTS + WHEEL_RADIUS,
                   -2 * CUBE_HALF_EXTENTS + WHEEL_RADIUS)

        for x, z in zip(xvalues, zvalues):
            connectionPointCS0 = dk.Vector3(x, CONNECTION_HEIGHT, z)
            print('connectionPointCS0: ', connectionPointCS0)
            self.vehicle.addWheel(connectionPointCS0, wheelDirectionCS0,
                                  wheelAxleCS, suspensionResetLength,
                                  WHEEL_RADIUS, **tunning)

        self.vehicle.resetSuspension()
        for wheel in self.vehicle.wheels:
            self.vehicle.updateWheelTransform(wheel)

        # shooting box!
        self.shootingShapes = (dk.BoxShape(0.5, 0.5,
                                           0.5), dk.BoxShape(1.0, 0.5, 1.0),
                               dk.BoxShape(2.0, 0.5, 1.0),
                               dk.CylinderShape(1.0, 1.0, 1.0),
                               dk.CylinderShape(1.5, 0.5,
                                                1.5), dk.ConeShape(1.0, 1.5),
                               dk.ConeShape(2.5, 1.5), dk.SphereShape(1.0))

        # ui buttons
        self.accelButton = SimpleButton('Acc', frame=dk.Rect(100, 100, 80, 80))
        self.accelButton.backgroundColor = dk.color.blue
        self.brakeButton = SimpleButton('Brake',
                                        frame=dk.Rect(10, 100, 80, 80))
        self.brakeButton.backgroundColor = dk.color.red
        self.cameraButton = dk.ui.Button(text='Reset Camera',
                                         frame=dk.Rect(10, 10, 80, 50))
        self.cameraButton.addTarget(self, self.resetCamera)

        self.addChild(self.accelButton)
        self.addChild(self.brakeButton)
        self.addChild(self.cameraButton)

        self.steerSlider = dk.ui.Slider(frame=dk.Rect(200, 100, 200, 50))
        self.steerSlider.thumbRadius = 20
        self.addChild(self.steerSlider)
        self.steerSlider.minimumValue = -0.3
        self.steerSlider.maximumValue = 0.3
        self.steerSlider.value = 0.0
        self.steerSlider.addTarget(self, self.onSteerChanged)

        # info labels
        self.infoLabel = dk.ui.Label()
        self.infoLabel.align = dk.ui.label.ALIGN_LEFT
        self.infoLabel.backgroundColor = dk.Color(0, 0, 0, 0.2)
        self.infoLabel.textColor = dk.Color(1, 1, 1, 1)
        self.infoLabel.outlineColor = dk.Color(0, 0, 0, 0.85)
        self.infoLabel.drawTextOutline = True
        self.addChild(self.infoLabel)

        # help labels
        self.helpText = dk.ui.Label(
            'Arrow Keys: move, left-click: move camera, right-click: shoot obstacle'
        )
        self.helpText.fontAttributes = dk.ui.font.attributes(14)
        self.helpText.backgroundColor = dk.color.clear
        self.helpText.outlineColor = dk.Color(0.2, 0.2, 0.2)
        self.helpText.textColor = dk.color.white
        self.helpText.setBlendState(dk.blendstate.defaultAlpha)
        self.addChild(self.helpText)

        self.captureKeyboard(0)
        #self.resetCamera()
        self.screen().postOperation(self.layout, ())
        self.autoShootingCount = 0
        self.autoShooting = self.screen().scheduleOperation(
            self.shootBoxFromAbove, (), interval=self.shootingInterval)
Exemple #18
0
class CameraInfo:
    fov = math.radians(60)
    near = 100
    far = 100000
    aspect = 1.0
    target = dk.Vector3(0, 0, 0)