当前位置: 首页 > 知识库问答 >
问题:

使用react三纤维加载网格(OBJ MTL JPG),纹理不起作用

阎宝
2023-03-14

在我的react应用程序中,我尝试创建一个显示从pix4d导出的3d网格的视图页面。该网格由三种类型的文件组成,(.obj、.mtl、.jpg)pix4d。通用域名格式

我是新来的,有三根纤维,我想这是解决我问题的最好办法。

下面是用于加载和渲染3D模型的react组件的完整代码。

密码

提前谢谢!

我想了解如何附加纹理

共有1个答案

董凡
2023-03-14

我花了几周的时间寻找这个答案,终于找到了一个可行的方法。

Material loader本身并没有解决远程文件的导入问题(它在web上解决,而不是在移动设备上,也许将来会)。所以,我正在创建材质并手动为其指定图像。

大概是这样的:

import { TextureLoader } from 'expo-three';
import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader';
import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader';
// useThree is used to get scene reference
import { useThree } from 'react-three-fiber';

const textureLoader = new TextureLoader();
const mapImage = textureLoader.load(require('path/to/image1.png'))
const normalMapImage = textureLoader.load(require('path/to/image2.png'))

请注意,来自expo three的TextureLoader可以处理从require()

const loaderObj = new OBJLoader();
const loaderMtl = new MTLLoader();

export default props => {
  const { scene } = useThree();

  loaderMtl.load(
    'https://url_to/material.mtl',
    mtl => {
      mtl.preload();

      loaderObj.setMaterials(mtl);
      loaderObj.load(
        'https://url_to/model.obj',
        obj => {
          // simple logic for an obj with single child
          obj.children[0].material.map = mapImage;
          obj.children[0].material.normalMap = normalMapImage;

          scene.add(obj)
        }
      )
    }
  )

  return null;
}

这是我第一次成功地尝试用mtl渲染obj,包括一个映射和一个法线映射,所以既然它可以工作,我们就可以不断更新代码以进行改进。

 类似资料:
  • 我正在使用React Three Fiber和“Drei”,并想使用广告牌。但我只知道如何改变广告牌的颜色,而不知道如何添加纹理。 我试过这样做,但在广告牌上找不到任何文档,也不知道我能传递什么样的论点。 在这里,您可以看到如何更改颜色,但不能看到如何添加纹理: https://drei.react-spring.io/?path=/story/abstractions-布告牌——布告牌街 希望有

  • 我正在尝试将位图纹理材质放置在由三个贴图创建的网格上。js形状测量学。 几何体是一个简单的八角形(我最终会添加曲线,使其成为一个圆角矩形)。 网格被创建并显示得很好,除了位图纹理显示为四个巨大的正方形,这似乎是加载图像的超复制低分辨率版本。 (加载的图像实际上是法国国旗的512x512照片) 如何获得纹理以使用加载图像的完整分辨率?(顺便说一句,将此纹理作为材质应用于由3.PlaneGeometr

  • 谢谢你花时间看我的问题。 我用的是三根纤维。我试图将小盒子连接到网格的两侧。我从光线投射器获得了长方体网格的位置。 我的问题是,在旋转父组后,t恤网格的矩阵似乎是反向的。据我所知,光线投射器是基于这个矩阵工作的。我确实尝试过updateMatrix()和updateMatrix World(),但结果令人困惑。 在这样旋转组之后,更新子矩阵的标准方法是什么?任何帮助都将不胜感激。 这是我问题的一个

  • 嘿,我不能让我的纹理出现,我不知道怎么了。辅导没有帮助。这是我的代码: spriteX=0,spriteY=0,spriteW=400,spriteL=400,x=0,y=0 这是我得到的输出:输出窗口 正如你所见,黑色三角形显示得很好,但没有纹理

  • 我以前做了几个实验,以找到绘制大规模六边形网格的最佳方法。 我尝试使用、绘制hexes。它在小网格中工作得很好,但如果我在一个网格中有超过1000+的单元格,fps就开始很难下降。 所以我想出了这个想法,将纹理(包含六边形网格模式)应用到一个简单的平面上。我只需要设置纹理的函数来指定垂直和水平执行多少次重复。