在上文中,讲了如何将max、obj、mb、fbx等主流格式的3D模型文件转换为egg、gltf格式,Panda3D可以加载的格式。在上文末尾,博主临时看到了一种方式,可以让Panda3d直接加载obj格式的文件,因此本文来专门看下如何实现。
先来看下在Stack Overflow上看到的回答。
Panda3D在1.10版本后可以直接加载obj,那我们看下要如何进行配置修改。
主要有两种方式来修改config.prc文件
1.在IDE中修改Config.prc文件
Panda3D的配置文件名称为 Config.prc,我们可以到这个文件里直接修改配置项。该文件可以通过PyCharm找到.
具体路径为External Libraries–>site-packages–>panda3d–>etc–>Config.prc
打开配置文件后,在最后一行添加上代码load-file-type p3assimp
。
修改后,重新启动就可以生效。
2.去panda3d的安装路径中修改
这个并不是指Panda3d SDK的安装路径,而是你使用的python环境,即通过pip安装的Panda3d。如果是使用的conda构建的虚拟环境,则需要到对应envs目录下。本文以conda虚拟环境的修改为例。
文件路径如下:conda的安装目录–> envs --> xxx(虚拟环境名字) --> Lib --> site-packages --> panda3d–>etc–>Config.prc
打开配置文件后,在最后一行添加上代码load-file-type p3assimp
3.示例
添加好配置文件后,代码中尝试下,在爱给网上下载如下2个模型:
加载代码如下:
from math import pi, sin, cos
from direct.showbase.ShowBase import ShowBase
from direct.task import Task
from direct.actor.Actor import Actor
from panda3d.core import DirectionalLight
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
self.setBackgroundColor(r=0.2549, g=0.41176, b=0.88235, a=0.4)
# 创建灯光--3D模型显示问题
dlight = DirectionalLight('my dlight')
self.dlnp = self.render.attachNewNode(dlight)
# 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, 40, 0)
# Add the spinCameraTask procedure to the task manager.
self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")
self.submarine = self.loader.loadModel("submarine.obj")
self.submarine.setScale(0.001, 0.001, 0.001)
self.submarine.setHpr(90, 90, 0)
self.submarine.setPos(10, 20, 5)
self.submarine.reparentTo(self.render)
self.submarine.setLight(self.dlnp)
self.beauty = self.loader.loadModel("./assets/anika/anika.obj")
self.beauty.setScale(5, 5, 5)
self.beauty.setHpr(90, 90, -90)
self.beauty.setPos(0, 0, 0)
self.beauty.reparentTo(self.render)
# self.beauty.setLight(self.dlnp)
# 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()
展示效果如下图所示:
本文对应的3D模型文件下载链接如下:
本文到这里也就结束了,这也是我在开发过程中遇到的问题。本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,因为才疏学浅,对3D建模很多知识都是了解皮毛,如果有什么错误,还请批评指正。
如果本文能对你有所帮助,还请给点赞、收藏、关注,给博主一波三连。