欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【panda3d】二、Controlling the Camera

程序员文章站 2022-07-13 09:19:11
...

默认摄像头控制系统
默认情况下,Panda3D运行一个任务,允许您使用鼠标移动相机。

The keys to navigate are:

Mouse Button

Action

Left Button

Pan left and right.

Right Button

Move forwards and backwards.

Middle Button

Rotate around the origin of the application.

Right and Middle Buttons

Roll the point of view around the view axis.

试试这个相机控制系统吧。它的问题是有时会很尴尬。把照相机对准我们想要的方向并不总是容易的。

Tasks

相反,我们将编写一个任务来显式地控制摄像机的位置。任务只不过是一个在每一帧都被调用的过程。更新你的代码如下:

from math import pi, sin, cos

from direct.showbase.ShowBase import ShowBase
from direct.task import Task


class MyApp(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)

        # Load the environment model.
        self.scene = self.loader.loadModel("models/environment")
        # Reparent the model to render.
        self.scene.reparentTo(self.render)
        # Apply scale and position transforms on the model.
        self.scene.setScale(0.25, 0.25, 0.25)
        self.scene.setPos(-8, 42, 0)

        # Add the spinCameraTask procedure to the task manager.
        self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")

    # Define a procedure to move the camera.
    def spinCameraTask(self, task):
        angleDegrees = task.time * 6.0
        angleRadians = angleDegrees * (pi / 180.0)
        self.camera.setPos(20 * sin(angleRadians), -20 * cos(angleRadians), 3)
        self.camera.setHpr(angleDegrees, 0, 0)
        return Task.cont


app = MyApp()
app.run()

 

add()过程告诉Panda3D的任务管理器调用过程spinCameraTask()每个帧。

这是我们写的控制摄像机的程序。只要过程spinCameraTask()返回常量AsyncTask。

DS_cont,任务管理器将继续在每一帧调用它。

在我们的代码中,spinCameraTask()过程根据已经过了多少时间来计算摄像机的期望位置。

摄像机每秒钟旋转6度。前两行计算相机的期望方向;首先是度,然后是弧度。

setPos()调用实际上设置了摄像机的位置。

(记住,Y是水平的,Z是垂直的,所以位置是通过动画X和Y来改变的,而Z是固定在地面以上3个单位。)

setHpr()调用实际上设置了方向。

运行这个程序
照相机不应该再放在地下;此外,它现在应该是轮流清算:

【panda3d】二、Controlling the Camera