一位艺术家为我提供了导出到.obj和.mtl的所有3D模型,以便可以使用OpenGL进行渲染。
但是我无法弄清楚为什么纹理顶点大于1且有时为负。看一下这个例子:
(...)
vn -0.000717425 0.00106739 -0.00991695
vn 3.49779e-09 -5.22866e-09 -0.01
vn -0.00142294 0.00211706 -0.00966919
vn -0.00831486 -0.00555545 0
vt 5.82424 -20.091
vt 6.97527 -20.1873
vt 5.81848 -20.1618
vt -7.48189 8.29159
(...)
Run Code Online (Sandbox Code Playgroud)
他将TGA格式的所有纹理发送给了我,我已正确加载了该纹理,但无法将这些vts 映射到正确的OpenGL纹理矢量。
我想知道如何使用顶点法线来实现闪电效果?目前我所拥有的是我可以将顶点和纹理坐标发送到着色器并使用它们但是使用法线,我不知道如何在着色器程序中使用它们.以下是我到目前为止的情况.
// vertex shader
layout(location = 0) in vec4 vert;
layout(location = 1) in vec4 color;
layout(location = 2) in vec2 texcoord;
uniform mat4 m_model;
uniform mat4 m_view;
uniform mat4 m_proj;
void main() {
gl_Position = m_proj * m_view * m_model * vert;
}
// fragment shader
in vec2 fragtexcoord;
out vec4 color;
uniform sampler2D textureunit;
void main(void) {
color = texture(textureunit, fragtexcoord);
}
Run Code Online (Sandbox Code Playgroud)
编辑 以下是我的着色器.
顶点着色器
layout(location = 0) in vec4 vert;
layout(location = 1) in vec4 color;
layout(location …Run Code Online (Sandbox Code Playgroud) 我从URL导入了Wavefront OBJ文件,现在我想将它插入我的iOS 9应用程序(在Swift中)的场景(SceneKit)中.到目前为止我所做的是:
let asset = MDLAsset(URL: localFileUrl)
print("count = \(asset.count)") // 1
Run Code Online (Sandbox Code Playgroud)
将此转换为SCNNode的任何帮助将不胜感激.根据Apple的文档:
模型I/O可以与MetalKit,GLKit和SceneKit框架共享数据缓冲区,以帮助您有效地加载,处理和呈现3D资产.
但我不知道如何从MDLAsset获取缓冲区到SCNNode.
一位艺术家朋友给我发了一个由3DS Max 2009导出的.obj文件,该文件包含三个纹理坐标作为vt命令的参数.根据.obj规范,这是正确的.但是,我不确定如何映射为常规2D .jpg纹理提供的UVW坐标.
这对我来说相对重要,因为我玩3DS Max试图弄清楚如何强制它只导出UV坐标,但似乎没有直接的方式.在这种情况下,这只是一个天空盒,但在其他情况下,它可能更复杂,而不是手动固定.
谢谢!
我正在使用 OpenGL ES 2.0 开发 Android 应用程序。
我想加载使用 Blender 2.49b 以 Wavefront OBJ 格式导出的文件。我已经确定了顶点位置、法线和纹理。
我想使用 glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) 来绘制网格,但我不知道如何从 Wavefront OBJ 文件中获取最后一个参数索引。
面孔是我正在寻找的“索引”吗?
我在论坛上发现了这一点:faces =Indexsstartingwith1!
“从 1 开始!”是什么意思?
谢谢。
在尝试使用OpenGL(和GLFW库)渲染3D对象时,模型会经历大量闪烁.我正在.obj使用我自己编写的库来读取文件.
下面写的是我的渲染函数:不幸的是,为了理解面和顶点是如何输入的,我将不得不提供所有链接的代码:压缩代码以及可执行文件和示例.obj:
Source
我从这里使用.obj文件来测试程序.现在,该程序不支持法线和纹理,这不是问题,因为网站上的大多数模型都没有它们.此外,(现在)它只读取"123.obj"所以该文件不应该被命名为其他任何东西.它只接受一个空间,而不是更多.
float render()
{
glfwSetTime(0.0f);
int win_width;
int win_height;
glfwGetWindowSize(&win_width, &win_height);
float win_aspect = (float)win_width / (float)win_height;
glViewport(0, 0, win_width, win_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90, win_aspect, 0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 50.0, 0, 0, 0, 0.0, 1.0, 0.0);
glEnable(GL_DEPTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_NORMALIZE);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glRotatef(angle , 0 , 1, 0);
glColor3f(0.0f, 0.0f, 0.0f);
int index = 0;
for(int a = 0; a < faces.size(); a++)
{
if(faces[a].vertices.size() == 3)
{ …Run Code Online (Sandbox Code Playgroud) 我正在为 OpenGL ES 2.0 在 objc 中编写我自己的 .obj 解析器,以便更好地了解 OpenGLES 的工作原理。加载顶点并显示带有顶点颜色的模型就像一个魅力。只是一个小提示:我正在使用索引缓冲区。
真正的问题是纹理 atm 的映射。正如您将在下面看到的更多内容一样,我的纹理没有按照应有的方式进行映射。
这是我认为 .obj 格式的工作原理,如果我错了,请纠正我:“f”线描述了一个面,其中斜线前的数字定义了顶点的索引,斜线后的数字定义了纹理坐标.
考虑以下 .obj 文件(由 Cinema 4D 导出):
v -75 75 -50
v 75 75 -50
v -75 -75 -50
v 75 -75 -50
vt 0 0
vt 0 1
vt 1 1
vt 1 0
f 4/3 3/2 1/1
f 2/4 4/3 1/1
Run Code Online (Sandbox Code Playgroud)
以及以下纹理:

现在,当我在 OpenGL ES 3D 空间中定位顶点并尝试将纹理坐标映射到每个单独的顶点时,映射出错了。我可以通过移动一些纹理坐标值来解决这个问题,但我意识到这不是这样做的方法。我还尝试编辑我的一些 .obj 导出器设置以翻转轴和/或 uv 映射,但没有一个会导致正确的映射。关于 .obj 文件格式,我的理论中是否缺少某些内容?我可能已经说过的一件事是:我昨天读到 .obj 格式的坐标系将 topleft 定义为纹理的锚点。所以我已经在解析中解决了这个问题。
这是当前情况的一个小总结: 更新:纹理的坐标系是实际的 .obj 纹理坐标系,而不是 OpenGL …
我一直在阅读David Brackeen 的《用 Java 开发游戏》。到现在为止我已经明白了书中的所有内容。在 Wavefront 对象文件中,我理解该v命令的作用,但不理解该f命令。例如:
# OBJ - Wavefront object file
# The javagamebook loader only understands these commands:
# mtllib <filename> - Load materials from an external .mtl
# file.
# v <x> <y> <z> - Define a vertex with floating-point
# coords (x,y,z).
# f <v1> <v2> <v3> ... - Define a new face. a face is a flat,
# convex polygon with vertices in
# counter-clockwise order. Positive
# …Run Code Online (Sandbox Code Playgroud) 我是 Qt Creator 的新手(版本 4.10.0,基于 Qt 5.13.1)。我已经接受了customitemgraph example,我想.obj用新文件替换现有文件。我从网上下载了一些免费模型。其中一些有效,但另一些则无效。
这是两个例子。
使用记事本打开的文件的摘录.obj,该文件正在运行
...
vn 0.3531 -0.8627 -0.3620
vn 0.3815 -0.9243 -0.0148
usemtl Default_OBJ
s 1
f 1/1/1 2/2/2 3/3/3 4/4/4
f 2/2/2 5/5/5 6/6/6 3/3/3
f 4/4/4 3/3/3 7/7/7 8/8/8
...
Run Code Online (Sandbox Code Playgroud)
一个不工作的情况:
...
vn -0.1013 -0.8959 -0.4325
vn -0.1003 -0.8978 -0.4287
usemtl Body
s 1
f 225536//133387 225537//133388 225544//133389 225543//133390
f 225537//133388 225538//133391 225545//133392 225544//133389
f 225538//133391 225539//133393 225546//133394 225545//133392
f 225539//133393 225540//133395 225547//133396 225546//133394
... …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 OpenGL 中从 Starfox 64 绘制这个免费的机翼模型。我在 Blender 中将 .fbx 文件转换为 .obj,并使用tinyobjloader来加载它(我的大学科目的所有要求)。
我几乎将示例代码(使用现代 API)放入我的程序中,替换了文件名,并抓取了attrib.vertices和attrib.normals向量来绘制机翼。
我可以使用 GL_POINTS 查看顶点:
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, &vertices[0]);
glDrawArrays(GL_POINTS, 0, vertices.size() / 3);
glDisableClientState(GL_VERTEX_ARRAY);
Run Code Online (Sandbox Code Playgroud)
哪个看起来是正确的(我......认为?):
但我不确定如何渲染实体模型。简单地用 GL_TRIANGLES(如图所示)或 GL_QUADS 替换 GL_POINTS 是行不通的:
我正在使用 OpenGL 1.1 w/ GLUT(再次,大学)。我想我只是不知道自己在做什么,真的。帮助?