使用 FastObjImporter 在场景中加载并显示 obj 模型

2023-12-20

在我的 Unity 项目中,我想使用在互联网上找到的 FastObjImporter 类将 obj 放入场景中。我是否必须创建一个空的 GameObject 并将已处理的 obj 分配给它?

尝试使用空的游戏对象:

GameObject go = new GameObject("obj");
myMesh = FastObjImporter.Instance.ImportFile(objPath);
Instantiate(myMesh, Vector3.zero, Quaternion.identity);
go.AddComponent<MeshRenderer>();
go.GetComponent<MeshFilter>().mesh = myMesh;

早些时候我尝试过这种方法,但它也不起作用:

GameObject go;
myMesh = FastObjImporter.Instance.ImportFile(objPath);
Instantiate(myMesh, Vector3.zero, Quaternion.identity);
go.GetComponent<MeshFilter>().mesh = myMesh;

有人可以解释我做错了什么吗?

CODE:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using System.IO;

/// <summary>
/// Sample
/// </summary>
public class DriveTest : MonoBehaviour
{
    //public static readonly string REQUIRED_MIME = "image/jpeg";
    //public string filePath;
    public string objPath;
    bool initInProgress = false;
    GoogleDrive drive;
    public string url;
    List<GoogleDrive.File> remoteObjFiles;

    public Mesh myMesh;
    public GameObject go;

    /* ---------------------------------------------------------------------------------------------------------------------------------- */
    void Start()
    {
        objPath = Application.persistentDataPath + "/testObj.obj";
        StartCoroutine(ImportObj());
        go = new GameObject("obj");
    }

    /* ---------------------------------------------------------------------------------------------------------------------------------- */

    void Update()
    {

        if (Input.GetKey(KeyCode.Escape))
            Application.Quit();
    }

    /* ---------------------------------------------------------------------------------------------------------------------------------- */

    IEnumerator ImportObj()
    {
        initInProgress = true;

        drive = new GoogleDrive();
        var driveInit = drive.Initialize();
        while (driveInit.MoveNext())
            yield return null;

        initInProgress = false;

        for (;;)
        {
            ( SEARCHING AND SETTING DOWNLOAD FOLDER IN GDRIVE )

            var download = drive.DownloadFile(remoteObjFiles[0]);
            yield return StartCoroutine(download);
            var data = GoogleDrive.GetResult<byte[]>(download);

            if (File.Exists(objPath))
            {
                File.Delete(objPath);
                File.WriteAllBytes(objPath, data);
            }
            else
                File.WriteAllBytes(objPath, data);

            Debug.Log("Obj: " + remoteObjFiles[0].ToString());

            if (File.Exists(objPath))
            {
                Debug.Log("Loading OBJ from the device");
                myMesh = FastObjImporter.Instance.ImportFile(objPath);
                Debug.Log("Obj imported...");
                Instantiate(myMesh, Vector3.zero, Quaternion.identity);
                go.AddComponent<MeshRenderer>();
                go.GetComponent<MeshFilter>().mesh = myMesh;
            }
            break;
        }
}

Regards


无需实例化 Mesh。它是一个组件,我不确定您是否可以实例化它。只需将其分配给材质即可。

代码中的主要问题是您没有创建材质和着色器。您需要创建一个材质,然后创建一个“标准”着色器并将该着色器分配给该材质。

我注意到FastObjImporter脚本很旧,决定尝试一下以确保其正常运行。我遇到了一个索引异常错误,然后修复了它。您可以获取修复版本的副本here https://pastebin.com/mCVbgabp。见线#57对于我所做的实际修复。

要创建的函数MeshFilder, 材料和MeshRenderer:

void attachMeshFilter(GameObject target, Mesh mesh)
{
    MeshFilter mF = target.AddComponent<MeshFilter>();
    mF.mesh = mesh;
}

Material createMaterial()
{
    Material mat = new Material(Shader.Find("Standard"));
    return mat;
}

void attachMeshRenderer(GameObject target, Material mat)
{
    MeshRenderer mR = target.AddComponent<MeshRenderer>();
    mR.material = mat;
}

创建新游戏对象、加载模型并将所有必要的组件附加到其上以显示它的函数:

GameObject loadAndDisplayMesh(string path)
{
    //Create new GameObject to hold it
    GameObject meshHolder = new GameObject("Loaded Mesh");

    //Load Mesh
    Mesh mesh = FastObjImporter.Instance.ImportFile(path);

    //return null;

    //Attach Mesh Filter
    attachMeshFilter(meshHolder, mesh);

    //Create Material
    Material mat = createMaterial();

    //Attach Mesh Renderer
    attachMeshRenderer(meshHolder, mat);

    return meshHolder;
}

Usage:

void Start()
{
    string objPath = Application.persistentDataPath + "/testObj.obj";

    GameObject obj = loadAndDisplayMesh(objPath);

    //Position it in front od=f the camera. Your ZOffset may be different
    Camera cam = Camera.main;
    float zOffset = 40f;
    obj.transform.position = cam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, cam.nearClipPlane + zOffset));
}

EDIT:

在极少数情况下,Unity 在 Android 上找不到着色器Shader.Find("Standard")用来。发生这种情况时,您会收到错误消息。

解决此问题的方法是在编辑器中创建材质并为其分配“标准”着色器。默认情况下它应该使用“标准”着色器。

1.创建一个材质,名称为“StandardMat”。

2.将该材料放入名为“Resources”的文件夹中。如果不存在则创建它。你必须正确拼写这个。同样,该文件夹必须命名为“Resources”并放置在“Asset”文件夹中。

3.您可以加载材料Resources.Load("StandardMat") as Material.

In the createMaterial上面的函数,

Change

Material mat = new Material(Shader.Find("Standard"));

to

Material mat = Resources.Load("StandardMat") as Material;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 FastObjImporter 在场景中加载并显示 obj 模型 的相关文章

  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • Java 不可变对象 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在学习不变性的概念 据我了解 一旦创建对象 不可变对象就无法更改其值 但我不明白不可变对象的以下用途 They are 自动是线程
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 私有模板函数

    我有一堂课 C h class C private template
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • Python 类的意外行为

    我正在 OOP 中开发一个纸牌游戏只是为了练习 到目前为止我所写的内容中有一些奇怪的行为 当我使用clear方法清空双手时 会发生的是个别双手显示它们是空的 但是当我查看双手变量 显示双手 时 它们不是空的 我的问题是为什么 哈哈 我将把代
  • 如何管理不是通过类型下载的类型定义文件?

    我有一个Angular我正在使用的应用程序npm and typings管理拉下我的类型定义文件 d ts for TypeScript 不过我有几个 d ts不存在的文件typings并且可以手动滚动或从备用源手动下载 从项目结构的角度来
  • 映射类型以使所有属性成为必需

    TypeScript 类可以具有可选属性和必需属性 class SomeClass foo string bar string baz string qux string The Partial
  • Android Market 搜索引擎如何工作? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 如何提高应用在 Android Market 搜索结果中的排名 这些应用程序似乎没有按下载量排序 Edit 这个问题的范围仅限于使用 Android
  • 在 iPhone 上拖动 UIScrollView 时,OpenGL ES 视图中的动画冻结

    我有一个动画透明 OpenGL ES 子视图 Apple 模板 EAGLView 类的修改 它绘制一个旋转球体 就像 Apple 的示例一样 CADisplayLink 用于可用的设备 在同一屏幕上 有一个包含可以选择的 UIButtons
  • 如何为默认值“现在”的日期字段建立索引?

    我需要添加日期字段类型 以便文档将当前系统日期时间作为默认值 我正在使用 Elasticsearch 7 5 PUT myindex mappings properties create date type date format yyyy
  • 我不明白为什么我的 JavaScript 文件在链接时不会显示

    我不明白这里出了什么问题 而且我没有从 Javascript 文件中得到任何输出 我正在尝试使用 src 以便能够在索引文件之外键入我的 javascript 文件 这只是打印 html 文件 A test header 中的标题 而不打印
  • 如何使用 Teams JS SDK v2 向 Microsoft Teams 中的用户或频道发送大文本消息?

    我目前正在使用 Microsoft Teams JavaScript SDK v2 TeamsJS 开发一个应用程序 并且正在努力寻找一种向特定用户或频道发送大文本消息的方法 我已成功使用 selectPeople API 使用户能够从列表
  • 什么是 Cache-Control: private?

    当我访问时chesseng herokuapp com http chesseng herokuapp com我得到一个响应标头 如下所示 Cache Control private Connection keep alive Conten
  • 如何在docker中运行无头浏览器?

    我正在使用无头浏览器构建一个爬虫 但现在我想对我的应用程序进行 dockerize 我已经在我的 docker 映像中安装了 chrome 但在运行脚本时它会抛出错误 启动Chrome js const chromeLauncher req
  • @Transactional 与 JPA 和 Hibernate 有什么用?

    我正在学习如何使用 JPA 和 Hibernate 以及 MySQL 数据库创建 REST API 并且我看到了这个 Transactional 注释 有人能解释一下这个注释有什么用吗 例如我有这个简单的 DAO 类 Repository
  • 将 csv 导入到 xlsx python

    我正在尝试将 csv 文件中的一些数据放入现有的 Excel 文件中 我现有的 Excel 文件包含图像 而 xlrd 无法获取图像 我尝试使用 xlsxwriter 但它无法附加到现有的 xslx 我找到的唯一解决方案是使用 openpy
  • AppDelegate 文件适合 MVC 中的什么位置?

    我正在学习 iPhone iPad 编程 我相信我理解了MVC的概念 我遇到的困难是理解普通 iPhone iPad 应用程序中的某些文件如何适合 MVC 当您使用 基于视图的应用程序 模板创建新应用程序时 将创建 AppDelegate
  • Python pandas - 如果该项目在列表中,则新列的值

    我想在 pandas 数据框中创建一个新列 第一列包含国家 地区名称 该列表包含我感兴趣的国家 例如欧盟 新列应指示数据框中的国家 地区是否在列表中 以下是代码的简化版本 import pandas as pd import numpy a
  • 如何求一系列数字的最小公倍数?

    给定一个由两个数字组成的数组 让它们定义一系列数字的开始和结束 例如 2 6 表示范围 2 3 4 5 6 我想编写 javascript 代码来查找范围的最小公倍数 我下面的代码仅适用于小范围 而不是类似的 1 13 即范围 1 2 3
  • SSH 握手抱怨缺少主机密钥

    我正在尝试连接到远程主机并检查文件是否存在 在这个阶段 我只是尝试连接 但出现错误 2017 08 01 18 16 39 unable to connect ssh handshake failed ssh required host k
  • 如何并行化 Azure ML 服务计算集群上的工作?

    我可以使用计算集群将作业提交到 Azure ML 服务 它运行良好 并且自动缩放与自定义环境的良好灵活性相结合似乎正是我所需要的 然而 到目前为止 所有这些作业似乎只使用集群的一个计算节点 理想情况下 我希望使用多个节点进行计算 但我看到的
  • 当我在 android 中使用哈希映射时显示警告(使用新的 SparseArray

    我是 Android 开发新手 在我使用的 Android 应用程序中HashMap 但我收到警告 Use new SparseArray
  • URL 中的段落字符?

    我刚刚遇到了这个Google 应用引擎文章 http code google com googleapps appsscript articles appengine html在某些 URL 中使用有趣的反向 P 字符 查看第一个代码框顶部
  • 使用 FastObjImporter 在场景中加载并显示 obj 模型

    在我的 Unity 项目中 我想使用在互联网上找到的 FastObjImporter 类将 obj 放入场景中 我是否必须创建一个空的 GameObject 并将已处理的 obj 分配给它 尝试使用空的游戏对象 GameObject go