回到我每天愚蠢的问题.今天我正在尝试在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) 我正在尝试使用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类的链接
我究竟做错了什么?为什么不加载.mtl文件?根据我的理解,它应该加载.mtl文件,该文件与.obj文件位于同一文件夹和同名文件中.
编辑 我已经搞砸了一些,在ObjLoader类中添加一些行来记录它是什么而不是加载.看起来它正在加载mtl文件,并将每个mtl分配给一个Material实例,它看起来似乎obj正确地要求这些材料.
我需要在OpenGL端启用或以其他方式执行此操作以确保它正确使用这些材料吗?
我想以递归方式解析字符串并将结果存储在一个结构中.我编写了一个可以处理一次迭代的解析器.输入格式如下:
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 >> elements为start = *(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 ++中的.obj处理程序.导入数据不应该是一个问题,但我不明白为什么有可能,.obj(例如从blender导出)有比'v'更多的'vt'条目.如果有人能解释我,我会非常高兴!
谢谢!
所以我正在为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个随机样本.如果每组只有一种材料,我可以查找该组中的三角形并生成样本.但是如果该组包含一些具有正确材料的三角形而一些没有,则我必须在组检查之前进行一些奇怪的材料检查以生成正确的样本.这是只是一个例子 - 还有其他一些问题也成了问题)
我有一个vector<vector<int>>,其中包含我的地图(使用随机生成器创建的二维数组):

(来源:cjoint.com)
我想以 3D 方式显示这张地图(使用 Irrlicht 图形 3D 库)。大问题:我的地图太大(1920x1080),所以我无法在屏幕上显示 2073600 个小立方体。(我希望能够更改我的地图并使用良好的网格重新加载屏幕)
所以我的解决方案是创建一个立方体,并在上面写下我想要的所有像素(这是我的小油漆向您展示......)

(来源:cjoint.com)
所以...我知道如何在 C++ 中创建/写入/解析文件,现在我的问题是:我不太了解 3D 透视和 .obj 对象...
我正在通过维基百科和其他文档学习 OBJ 格式。
我想知道是否有比更改实时 .obj 对象更简单的解决方案...如果没有...我需要一些帮助来构思我的 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) 我正在尝试为OpenGL项目创建一个Wavefront(.obj)文件加载器.我正在使用的方法是逐行进行并分离矢量(std :: vectors)中的顶点位置,纹理位置和正常位置,并且我将它们的索引(顶点,纹理和法线索引)存储在三个单独的中向量(来自文件的'f'行,每个面).
我无法根据纹理索引对完整的纹理坐标进行排序.我能够将顶点渲染到正确的位置,因为我的'loader'类需要索引,但我无法弄清楚如何以任何方式对纹理坐标进行排序,因此纹理在某些三角形上看起来像是一个偏移结果.
偏移纹理的多维数据集的图像:

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

编辑:这是.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) 我正在尝试使用 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)
然而,它看起来并不像一个表面。因此,我尝试Mesh3d使用:
fig = go.Figure(data=[go.Mesh3d(x=x, y=y, z=z, color='lightpink', opacity=0.50)])
Run Code Online (Sandbox Code Playgroud)
显然,这个剧情并不顺利。我尝试在渲染绘图之前对 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) 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)