标签: wavefront

在NSArray中存储结构

回到我每天愚蠢的问题.今天我正在尝试在NSArray中放置一个结构.好吧,这很容易,将它包装在NSData中.如果你认识我,你知道你将会看到代码.在这个例子中,我将一个从Wavefront OBJ加载到结构中的顶点线并将其粘贴在一个数组中.

        NSArray *verticeLineParts = [currentLine componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        Coordinate c = CoordinateMake([[verticeLineParts objectAtIndex:1] floatValue],
                                      [[verticeLineParts objectAtIndex:2] floatValue],
                                      [[verticeLineParts objectAtIndex:3] floatValue]);
        [vertices addObject:[[NSData alloc] initWithBytes:&c length:sizeof(c)]];
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常.输出中的前几个对象:

2010-10-18 14:18:08.237 ObjLoader[3778:207] (
    <5d1613bd 13f3da3f 8ac745bd>,
    <f04c28bd 13f3da3f d88048bd>,
    <649427bd d61ddb3f d88048bd>,
    <477625bd d845db3f d88048bd>,
    <4c1722bd 1668db3f d88048bd>,
Run Code Online (Sandbox Code Playgroud)

在从阵列中拉出它们之后将它们打印出来,而不是那么多.违规代码:

for (int i = 0; i < [vertices count]; i++) {
    Coordinate c;
    fillCoordinateFromData(c, [vertices objectAtIndex:i]);
    NSLog(@"%@", CoordinateToNSString(c));
}

[snip]

void fillCoordinateFromData(Coordinate c, NSData *d) {
    void *bytes = malloc(12);
    [d getBytes:bytes];
    memcpy((void *)&c, …
Run Code Online (Sandbox Code Playgroud)

c struct objective-c wavefront nsdata

5
推荐指数
1
解决办法
4394
查看次数

LibGDX和ObjLoader没有显示.mtl?

我正在尝试使用LibGDX将.obj文件加载到Android项目中.这些文件没有纹理文件,但包含.mtl文件中的材质.我每晚使用最新的官方文件,渲染对象文件只会导致对象显示为白色.如何让ObjLoader使用.mtl文件?

@Override
public void create() {
    objLoader = new ObjLoader();
    model = objLoader.loadObj( Gdx.files.internal("data/obj.obj"), true);
}

@Override
public void render() {
    Gdx.gl.glClearColor(0, 0, 0, 0);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    batch.begin();

    model.render();

    batch.end();
}
Run Code Online (Sandbox Code Playgroud)

这就是调用渲染对象的代码的方式.这是ObjLoader类的链接

https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g3d/loaders/wavefront/ObjLoader.java

我究竟做错了什么?为什么不加载.mtl文件?根据我的理解,它应该加载.mtl文件,该文件与.obj文件位于同一文件夹和同名文件中.

编辑 我已经搞砸了一些,在ObjLoader类中添加一些行来记录它是什么而不是加载.看起来它正在加载mtl文件,并将每个mtl分配给一个Material实例,它看起来似乎obj正确地要求这些材料.

我需要在OpenGL端启用或以其他方式执行此操作以确保它正确使用这些材料吗?

android opengl-es wavefront libgdx

5
推荐指数
1
解决办法
2346
查看次数

解析成几个向量成员

我想以递归方式解析字符串并将结果存储在一个结构中.我编写了一个可以处理一次迭代的解析器.输入格式如下:

v  1.5 2.0 2.5
v  3.0 3.5 4.0
f 1 2 3
f 4 5 6 
v  4.5 5.0 5.5
v  6.0 6.5 7.0
f 7 8 9
f 10 11 12
Run Code Online (Sandbox Code Playgroud)

问题是它只解析前4行,它在第三行遇到'v'时停止.完整的代码如下.如何修改此代码,以便将其余输入解析为同一个结构?我已经尝试将启动规则修改start = vertex >> elementsstart = *(vertex >> elements),但这只会产生巨大的编译错误.同样如此start = +(vertex >> elements).有什么想法我应该如何修改规则?

#include <iostream>
#include <sstream>
#include <fstream>

#include "boost/spirit/include/qi.hpp"
#include "boost/spirit/include/support_iso8859_1.hpp"
#include "boost/fusion/include/adapt_struct.hpp"


struct ElemParseData
{
    std::vector<float> verts;
    std::vector<unsigned int> idx;
};

BOOST_FUSION_ADAPT_STRUCT(
    ElemParseData,
    (std::vector<float>, verts)
    (std::vector<unsigned int>, idx) …
Run Code Online (Sandbox Code Playgroud)

c++ boost-spirit wavefront boost-spirit-qi

5
推荐指数
1
解决办法
1377
查看次数

处理.obj文件:为什么可能有比顶点(v)更多的顶点纹理(vt)?

我正在使用c ++中的.obj处理程序.导入数据不应该是一个问题,但我不明白为什么有可能,.obj(例如从blender导出)有比'v'更多的'vt'条目.如果有人能解释我,我会非常高兴!

谢谢!

wavefront .obj

5
推荐指数
1
解决办法
1061
查看次数

Wavefront OBJ格式 - > Groups&usemtl命令

所以我正在为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个随机样本.如果每组只有一种材料,我可以查找该组中的三角形并生成样本.但是如果该组包含一些具有正确材料的三角形而一些没有,则我必须在组检查之前进行一些奇怪的材料检查以生成正确的样本.这是只是一个例子 - 还有其他一些问题也成了问题)

3d graphics rendering polygon wavefront

5
推荐指数
1
解决办法
735
查看次数

使用 C++ 创建 Wavefront .obj 文件(网格 3D)

我有一个vector<vector<int>>,其中包含我的地图(使用随机生成器创建的二维数组):

图像
(来源:cjoint.com

我想以 3D 方式显示这张地图(使用 Irrlicht 图形 3D 库)。大问题:我的地图太大(1920x1080),所以我无法在屏幕上显示 2073600 个小立方体。(我希望能够更改我的地图并使用良好的网格重新加载屏幕)

所以我的解决方案是创建一个立方体,并在上面写下我想要的所有像素(这是我的小油漆向您展示......)

图像
(来源:cjoint.com

所以...我知道如何在 C++ 中创建/写入/解析文件,现在我的问题是:我不太了解 3D 透视和 .obj 对象...

我正在通过维基百科和其他文档学习 OBJ 格式。

我想知道是否有比更改实时 .obj 对象更简单的解决方案...如果没有...我需要一些帮助来构思我的 obj...

c++ 3d mesh irrlicht wavefront

5
推荐指数
1
解决办法
3014
查看次数

glDrawElements不呈现来自obj文件的输入

我正在使用cl-opengl在lisp中编写一个对象加载器,当尝试使用时渲染加载的顶点/元素时glDrawElements,我留下了一个空白屏幕.

(require :cl-opengl)
(require :sdl2)

(defvar *vertices* nil)
(defvar *elements* nil)

(setf *vertices* (make-array 9 :fill-pointer 0))
(setf *elements* (make-array 9 :fill-pointer 0))

(defvar *vertex-shader* "
#version 330 core 
layout (location = 0) in vec3 aPos;

void main() {
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
")

(defvar *fragment-shader* "
#version 330 core
out vec4 FragColor;

void main() {
    FragColor = vec4(0.95f, 0.98f, 0.65f, 1.0f);
}
")

(defun split-str-1 (string &optional (separator " ") (r nil))
  (let ((n …
Run Code Online (Sandbox Code Playgroud)

lisp opengl common-lisp wavefront

5
推荐指数
1
解决办法
181
查看次数

如何根据Wavefront(.obj)文件中给出的纹理索引对纹理位置进行排序?

我正在尝试为OpenGL项目创建一个Wavefront(.obj)文件加载器.我正在使用的方法是逐行进行并分离矢量(std :: vectors)中的顶点位置,纹理位置和正常位置,并且我将它们的索引(顶点,纹理和法线索引)存储在三个单独的中向量(来自文件的'f'行,每个面).

我无法根据纹理索引对完整的纹理坐标进行排序.我能够将顶点渲染到正确的位置,因为我的'loader'类需要索引,但我无法弄清楚如何以任何方式对纹理坐标进行排序,因此纹理在某些三角形上看起来像是一个偏移结果.

偏移纹理的多维数据集的图像:

IMG

纹理(.png)的图像,它应该如何在每张脸上:

IMG

编辑:这是.obj文件和.mtl文件的链接. Google云端硬盘.

这是我的OBJLoader.cpp文件:

    rawObj.open(filePath); // Open file

    while (!rawObj.eof()) {
        getline(rawObj, line); // Read line

        // Read values from each line 
        // starting with a 'v' for 
        // the vertex positions with
        // a custom function (gets the word in a line
        // at position i)

        if (strWord(line, 1) == "v") {   
            for (int i = 2; i <= 4; i++) {
                std::string temp;
                temp = strWord(line, i);
                vertexStrings.push_back(temp);
            }

        // Same for texture …
Run Code Online (Sandbox Code Playgroud)

c++ opengl stdvector wavefront

5
推荐指数
1
解决办法
457
查看次数

Plotly 来自 Wavefront OBJ 文件的 Mesh3d 绘图

我正在尝试使用 Plotly 绘制腿部的 3D 扫描图Mesh3D

我使用scatter_3dXYZ 点来展示这个概念:

fig = px.scatter_3d(df, x='x', y='y', z='z', opacity = 0.8)
Run Code Online (Sandbox Code Playgroud)

Plotly XYZ 点的 3D 散点图

然而,它看起来并不像一个表面。因此,我尝试Mesh3d使用:

fig = go.Figure(data=[go.Mesh3d(x=x, y=y, z=z, color='lightpink', opacity=0.50)])
Run Code Online (Sandbox Code Playgroud)

绘制 XYZ 点的 3D 网格图

显然,这个剧情并不顺利。我尝试在渲染绘图之前对 df 进行排序,但没有帮助。

重申一下,我正在寻找该 XYZ 数据的平滑曲面图。

这是扫描的XYZ 数据

编辑:有关曲面图介绍的继续信息

我用下面的代码实现了曲面图。不幸的是,没有渲染任何图(也没有伴随错误)。

colnames = ['x', 'y', 'z']
df = pd.read_csv('sandbox\leg.txt', sep = ' ', header = None, names = colnames)
x, y = np.array(df['x'].tolist()), np.array(df['y'].tolist())
df2 = df.pivot(index = 'x', columns = 'y', values = 'z')
z = df2.values
fig …
Run Code Online (Sandbox Code Playgroud)

python 3d plot wavefront plotly

5
推荐指数
1
解决办法
4625
查看次数

PyOpenGL 如何导入 obj 文件?

import pygame
import OpenGL
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import pywavefront


scene = pywavefront.Wavefront('Handgun_obj.obj')

vertices =(
    (1,-1,-1),
    (1,1,-1),
    (-1,1,-1),
    (-1,-1,-1),
    (1,-1,1),
    (1,1,1),
    (-1,-1,1),
    (-1,1,1),
    )

edges = (
    (0,1),
    (0,3),
    (0,4),
    (2,1),
    (2,3),
    (2,7),
    (6,3),
    (6,4),
    (6,7),
    (5,1),
    (5,4),
    (5,7)
    )

colors = (
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (0,1,0),
    (1,1,1),
    (0,1,1),
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (1,0,0),
    (1,1,1),
    (0,1,1),
    )

surfaces = (
    (0,1,2,3),
    (3,2,7,6),
    (6,7,5,4),
    (4,5,1,0),
    (1,5,7,2),
    (4,0,3,6)
    )



def Cube():
    glBegin(GL_QUADS)
    for surface in …
Run Code Online (Sandbox Code Playgroud)

python opengl pyopengl wavefront blender

5
推荐指数
1
解决办法
2万
查看次数