panda3d 键盘移动场景

这篇博客介绍了如何利用Panda3D库创建一个3D场景,并实现角色漫游和场景旋转。通过键盘的a和s键可以控制场景视角的左右转动,同时展示了基础的碰撞检测概念,尽管实际的碰撞检测代码未在此处详述。场景中包含了人物模型和环境模型,并设置了光照效果,为后续的碰撞检测功能奠定了基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看一下panda3d示例Tut-Roaming-Ralph.py;

角色在场景中漫游;光标键控制人物;a、s键旋转场景;

pview看一下示例的模型,一个是人的模型,还有一个是场景;

它的代码比较多;除了场景漫游,还有碰撞检测;碰撞检测,就是人物碰到坡,打光标键自己会爬,碰到树,打前进光标键,人物应动不了;下回再整碰撞检测;

先看一下a和s键旋转场景;根据它的示例大体做一下,

import direct.directbase.DirectStart
from panda3d.core import CollisionTraverser,CollisionNode
from panda3d.core import CollisionHandlerQueue,CollisionRay
from panda3d.core import Filename,AmbientLight,DirectionalLight
from panda3d.core import PandaNode,NodePath,Camera,TextNode
from panda3d.core import Vec3,Vec4,BitMask32
from direct.gui.OnscreenText import OnscreenText
from direct.actor.Actor import Actor
from direct.showbase.DirectObject import DirectObject
import random, sys, os, math

class World(DirectObject):

    def __init__(self):

        self.keyMap = {"left":0, "right":0, "forward":0, "cam-left":0, "cam-right":0}
        base.win.setClearColor(Vec4(0,0,0,1))

        self.environ = loader.loadModel("models/world")      
        self.environ.reparentTo(render)
        self.environ.setPos(0,0,0)
        
        self.accept("a", self.setKey, ["cam-left",1])
        self.accept("s", self.setKey, ["cam-right",1])
       
        taskMgr.add(self.move,"moveTask")
        base.disableMouse()
       
        # Create some lighting
        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor(Vec4(.3, .3, .3, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection(Vec3(-5, -5, -5))
        directionalLight.setColor(Vec4(1, 1, 1, 1))
        directionalLight.setSpecularColor(Vec4(1, 1, 1, 1))
        render.setLight(render.attachNewNode(ambientLight))
        render.setLight(render.attachNewNode(directionalLight))
    
    def setKey(self, key, value):
        self.keyMap[key] = value

    def move(self, task):
        if (self.keyMap["cam-left"]!=0):
            base.camera.setX(base.camera, -20 * globalClock.getDt())
        if (self.keyMap["cam-right"]!=0):
            base.camera.setX(base.camera, +20 * globalClock.getDt())
        return task.cont

w = World()
run()

 

    场景加载了,打a或s键,只有一下效果,场景一直在移动;下回再整; 

 self.keyMap = {"left":0, "right":0, "forward":0, "cam-left":0, "cam-right":0}

python的语法还不太熟悉,这个map数组看上去没有先声明,直接赋值就可以了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值