​ 在上文中,讲了如何将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找到.

Panda3D如何加载obj格式的3D模型文件-LMLPHP
Panda3D如何加载obj格式的3D模型文件-LMLPHP

​ 具体路径为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模型:潜艇、人物obj模型-CSDN文库


​ 本文到这里也就结束了,这也是我在开发过程中遇到的问题。本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,因为才疏学浅,对3D建模很多知识都是了解皮毛,如果有什么错误,还请批评指正。

​ 如果本文能对你有所帮助,还请给点赞、收藏、关注,给博主一波三连。

11-09 08:25