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


    ​ 在上文中,讲了如何将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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    ​ 展示效果如下图所示:

    资源分配图

    ​ 本文对应的3D模型文件下载链接如下:

    3D模型:潜艇、人物obj模型-CSDN文库


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

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

  • 相关阅读:
    dpdk 基于 rte_tailq_head 在多进程间共享内存的原理
    2022就业季|Spring认证教你,如何使用 Spring 构建 REST 服务(二)
    【JAVA多线程】JMM,成体系聊一下JAVA线程安全问题
    k8s使用traefik暴露http服务和tcp服务
    ARIMA模型与ARIMA-GARCH模型预测时间序列
    基于PyQt5和PSoC6的多功能平衡车设计
    LeetCode【74】搜索二维矩阵
    为虚拟化环境带来更强I/O性能!SR-IOV技术简介
    从不同视角理解架构
    Html 后端了解基础
  • 原文地址:https://blog.csdn.net/qq_34666857/article/details/127758233