如何将3D Studio动画模型导出为OBJ格式(如果可能)?结果文件会是什么样的?我怎么读?
我想为Blender的.obj文件编写一个解析器.文件格式似乎不言自明,但似乎也缺少一些数据.例如,一个简单的立方体(默认的Blender立方体)有8行顶点,但我希望看到36行(12个三角形形成一个立方体).
我认为,对我而言,混乱源于在direct3d中创建立方体的方式.Direct3d需要36个顶点才能形成立方体.所以我想我需要推断其他28个顶点.当尝试解析更复杂形状的顶点时,这种类型的猜测可能会导致问题.所以,我想如果我能找到文件格式的官方规格,它可能会让我对如何解释数据有所了解.
似乎其他人之前曾问过同样的问题:如何从BLC上的DCC工具中获取OBJ文件中适当数量的顶点,以便在OpenGL ES中使用? 但它对我没有任何有用的信息.
我正在使用ThreeJS和WebGL构建一个小型3D应用程序.我故意选择不将模型转换为ThreeJS兼容的.json文件,而是开始构建导入器.它工作正常,但我还计划让应用程序决定使用文件扩展名和MIME类型加载了哪种类型的模型,如果第一个未知,则使用后者.
我已经读过MIME类型应该是的地方,application/wavefront-obj因为还有model树,所以会有点奇怪,但不管怎么说都没关系.虽然浏览IANA网站的此文件类型不会产生任何结果.
我错过了什么吗?
起初,它似乎很明显......无论在哪里找到4个指数,每个面都会生成2个三角形,对吧?
含义如下:
v 1.000000 1.000000 0.000000
v -1.000000 1.000000 -0.000000
v 1.000000 -1.000000 0.000000
v -1.000000 -1.000000 -0.000000
f -4 -3 -2 -1
Run Code Online (Sandbox Code Playgroud)
......反过来,需要转换为:
v 1.000000 1.000000 0.000000
v -1.000000 1.000000 -0.000000
v 1.000000 -1.000000 0.000000
v -1.000000 -1.000000 -0.000000
f -4 -3 -2
f -2 -3 -1
Run Code Online (Sandbox Code Playgroud)
当然,这个特定的例子可以正确呈现.
但是,并非所有情况都像将面分割成两个面一样简单(其中第一个面包含原始面的前三个顶点,第二个面包含最后3个顶点,如上例所示).以下面的多维数据集为例:
v 0.000000 1.000000 1.000000
v 0.000000 0.000000 1.000000
v 1.000000 0.000000 1.000000
v 1.000000 1.000000 1.000000
v 0.000000 1.000000 0.000000
v 0.000000 0.000000 0.000000
v 1.000000 0.000000 0.000000
v 1.000000 …Run Code Online (Sandbox Code Playgroud) 我正在使用React VR开发一个应用程序,我用搅拌器创建了一个3D pokeball.我将其导出为Wavefront .obj文件并在我的React VR应用程序中使用它.
在控制台中我看到了这个警告:
THREE.MeshBasicMaterial:shininess,emissive并且specular不是这种材料的财产.
您可以在下面找到我的代码:
import React from 'react';
import { AppRegistry, asset, StyleSheet, Pano, Text, View, Mesh } from 'react-vr';
class pokemongo extends React.Component {
render() {
return (
<View>
<Pano source={asset('sky.jpg')} />
<Mesh source={{ mesh: asset('pokeball.obj'), mtl: asset('pokeball.mtl') }}
style={{ height: 1 }}
transform={{ rotate: '0 90 0' }}></Mesh>
</View>
);
}
};
AppRegistry.registerComponent('pokemongo', () => pokemongo);
Run Code Online (Sandbox Code Playgroud)
这是渲染输出
在这个GitHub Gist上你可以找到obj和mtl文件,你可以下载该blend …
因此,使用此处定义的wavefront对象文件:http: //en.wikipedia.org/wiki/Wavefront_.obj_file
我该如何渲染在opengl中有超过4个顶点的面.我承诺如果它有3个顶点我使用GL_TRIANGLES,如果它有4我使用GL_QUADS,但如果它有5或更多,我应该使用什么?有标准吗?在我的互联网搜索中我还没有能够提出任何东西和样本打开gl代码我发现只支持最多4个顶点.
在尝试解析wavefront .obj文件时,我想到了两种方法:
IMO,选项1将非常耗费内存,但要快得多.由于选项2涉及大量文件读取(并且因为大多数对象中的顶点数量变得非常大),因此速度会慢得多,但记忆密集程度会降低.
问题是:比较内存和速度之间的权衡,哪个选项更适合普通计算机?而且,还有另一种方法吗?
我计划使用OpenGL和GLFW来渲染对象.
我有这种矩阵(13 x 13):
0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 …Run Code Online (Sandbox Code Playgroud) 我的.obj文件旁边有一个.mtl文件,它指定了对象的材质.我试图创建一个解析器但不知道"Ke"属性的含义.例如:
Ka 0.78 0.78 0.78
Kd 0.78 0.78 0.78
Ks 0 0 0
Ke 17 12 4 # What does this line mean?
Run Code Online (Sandbox Code Playgroud)
谢谢 :)
所以我正在为wavefront obj模型文件编写一个解析器,并且有一些我不确定如何处理的不规则.
因此,根据我的阅读,可以使用'g'命令将网格分成组,并使用'usemtl'命令将材质分配给每个组
所以一个理想的文件看起来像这样:
g group1
usemtl material1
//vertices
//UV coords
//faces
g group2
usemtl material2
//vertices
//UV coords
//faces
etc....
Run Code Online (Sandbox Code Playgroud)
但是在我下载的一些obj文件中(从Turbosquid这样的地方),我看到一个组包含多个"usemtl",如下所示:
g group1
usemtl material1
//vertices, faces, etc
usemtl material2
//vertices, faces, etc
g group2
usematerial material3
//vertices, faces, etc
Run Code Online (Sandbox Code Playgroud)
因此,如果每组可以有多种材料,那么群体的重点是什么?
这些文件被认为是"非标准"还是破损?
我应该改为基于共享材料而不是共享组对面部进行分组吗?
每组有多种材料会使我的许多代码复杂化(例如 - 假设我必须在一组具有特定材料的三角形/面上生成一组N个随机样本.如果每组只有一种材料,我可以查找该组中的三角形并生成样本.但是如果该组包含一些具有正确材料的三角形而一些没有,则我必须在组检查之前进行一些奇怪的材料检查以生成正确的样本.这是只是一个例子 - 还有其他一些问题也成了问题)