Ich mache einen einfachen Exporteur für Blender 2.6x für ein benutzerdefiniertes JSON-Format (vor allem für die Verwendung mit WebGL), weil die vorhandenen ich online nicht finden konnte arbeite mit Blender 2.6.Blender 2.6 JSON-Exporteur, Textur falsch nur eine Seite des Würfels
Ich habe es fast funktioniert, aber ein Bug bleibt, dass ich nicht herausfinden kann. Bei einem einfachen Würfel ist die Textur auf einer Seite falsch ausgerichtet. Der Rest des Würfels ist richtig strukturiert.
Sie können ein Bild des Problems hier sehen (die linke Seite auf der linken Seite ist in der falschen Ausrichtung, wie auf den richtigen Würfel auf der rechten Seite im Vergleich):
Gibt es einige häufige Missverständnisse oder Fehler, die dazu führen könnten, dass dieses Verhalten auftritt?
Dies ist die Funktion, die (hier sein muss, aber ich kann es nicht finden die Fehler) von Blender 2.65 zu meinen benutzerdefinierten JSON-Format exportiert:
def get_json(objects, scene):
""" Currently only supports one scene.
Exports with -Z forward, Y up. """
object_number = -1
scene_data = []
# for every object in the scene
for object in bpy.context.scene.objects:
# if the object is a mesh
if object.type == 'MESH':
object_number += 1
# convert all the mesh's faces to triangles
bpy.ops.object.mode_set(mode='OBJECT')
object.select = True
bpy.context.scene.objects.active = object
# triangulate using new Blender 2.65 Triangulate modifier
bpy.ops.object.modifier_add(type='TRIANGULATE')
object.modifiers["Triangulate"].use_beauty = False
bpy.ops.object.modifier_apply(apply_as="DATA", modifier="Triangulate")
bpy.ops.object.mode_set(mode='OBJECT')
object.select = False
# add data to scene_data structure
scene_data.append({
"name" : object.name,
"vertices" : [],
"indices" : [],
"normals" : [],
"tex_coords" : []
})
vertex_number = -1
# for each face in the object
for face in object.data.polygons:
vertices_in_face = face.vertices[:]
# for each vertex in the face
for vertex in vertices_in_face:
vertex_number += 1
# store vertices in scene_data structure
scene_data[object_number]["vertices"].append(object.data.vertices[vertex].co.x + object.location.x)
scene_data[object_number]["vertices"].append(object.data.vertices[vertex].co.z + object.location.z)
scene_data[object_number]["vertices"].append(-(object.data.vertices[vertex].co.y + object.location.y))
# store normals in scene_data structure
scene_data[object_number]["normals"].append(object.data.vertices[vertex].normal.x)
scene_data[object_number]["normals"].append(object.data.vertices[vertex].normal.z)
scene_data[object_number]["normals"].append(-(object.data.vertices[vertex].normal.y))
# store indices in scene_data structure
scene_data[object_number]["indices"].append(vertex_number)
# texture coordinates
# bug: for a simple cube, one face's texture is warped
mesh = object.to_mesh(bpy.context.scene, True, 'PREVIEW')
if len(mesh.tessface_uv_textures) > 0:
for data in mesh.tessface_uv_textures.active.data:
scene_data[object_number]["tex_coords"].append(data.uv1.x)
scene_data[object_number]["tex_coords"].append(data.uv1.y)
scene_data[object_number]["tex_coords"].append(data.uv2.x)
scene_data[object_number]["tex_coords"].append(data.uv2.y)
scene_data[object_number]["tex_coords"].append(data.uv3.x)
scene_data[object_number]["tex_coords"].append(data.uv3.y)
return json.dumps(scene_data, indent=4)
Und für den Fall, würde dies helfen, einen Reim aus, hier sind die exportierte JSON-Daten, die meine Exportergebnisse Skript (die gleichen Daten verwendet machen den Würfel auf der linken Seite im Bild oben) ab:
[
{
"vertices": [
-1.0203653573989868,
1.0320179611444473,
0.669445663690567,
-1.0203653573989868,
1.0320179611444473,
-1.330554336309433,
-1.0203653573989868,
-0.9679820388555527,
0.669445663690567,
-1.0203653573989868,
1.0320179611444473,
-1.330554336309433,
0.9796346426010132,
1.0320179611444473,
-1.330554336309433,
-1.0203653573989868,
-0.9679820388555527,
-1.330554336309433,
0.9796346426010132,
1.0320179611444473,
-1.330554336309433,
0.9796346426010132,
1.0320179611444473,
0.669445663690567,
0.9796346426010132,
-0.9679820388555527,
-1.330554336309433,
0.9796346426010132,
1.0320179611444473,
0.669445663690567,
-1.0203653573989868,
1.0320179611444473,
0.669445663690567,
0.9796346426010132,
-0.9679820388555527,
0.669445663690567,
-1.0203653573989868,
-0.9679820388555527,
0.669445663690567,
-1.0203653573989868,
-0.9679820388555527,
-1.330554336309433,
0.9796346426010132,
-0.9679820388555527,
0.669445663690567,
0.9796346426010132,
1.0320179611444473,
0.669445663690567,
0.9796346426010132,
1.0320179611444473,
-1.330554336309433,
-1.0203653573989868,
1.0320179611444473,
0.669445663690567,
-1.0203653573989868,
1.0320179611444473,
-1.330554336309433,
-1.0203653573989868,
-0.9679820388555527,
-1.330554336309433,
-1.0203653573989868,
-0.9679820388555527,
0.669445663690567,
0.9796346426010132,
1.0320179611444473,
-1.330554336309433,
0.9796346426010132,
-0.9679820388555527,
-1.330554336309433,
-1.0203653573989868,
-0.9679820388555527,
-1.330554336309433,
0.9796346426010132,
1.0320179611444473,
0.669445663690567,
0.9796346426010132,
-0.9679820388555527,
0.669445663690567,
0.9796346426010132,
-0.9679820388555527,
-1.330554336309433,
-1.0203653573989868,
1.0320179611444473,
0.669445663690567,
-1.0203653573989868,
-0.9679820388555527,
0.669445663690567,
0.9796346426010132,
-0.9679820388555527,
0.669445663690567,
-1.0203653573989868,
-0.9679820388555527,
-1.330554336309433,
0.9796346426010132,
-0.9679820388555527,
-1.330554336309433,
0.9796346426010132,
-0.9679820388555527,
0.669445663690567,
0.9796346426010132,
1.0320179611444473,
-1.330554336309433,
-1.0203653573989868,
1.0320179611444473,
-1.330554336309433,
-1.0203653573989868,
1.0320179611444473,
0.669445663690567
],
"normals": [
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
-0.5773491859436035,
-0.5773491859436035,
0.5773491859436035,
0.5773491859436035
],
"indices": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35
],
"name": "Cube",
"tex_coords": [
0.008884529583156109,
0.6587533354759216,
0.3244488537311554,
0.3412468135356903,
0.32541996240615845,
0.657782256603241,
0.008884510956704617,
0.32541996240615845,
0.007913422770798206,
0.008884549140930176,
0.32541996240615845,
0.3244488537311554,
0.9920865893363953,
0.32444891333580017,
0.675551176071167,
0.32541996240615845,
0.9911155700683594,
0.00791349820792675,
0.3412467837333679,
0.008884538896381855,
0.6577821969985962,
0.007913422770798206,
0.34221789240837097,
0.32541996240615845,
0.6587532758712769,
0.6577821969985962,
0.3422178626060486,
0.6587533354759216,
0.6577821373939514,
0.3412468135356903,
0.6745801568031311,
0.34221789240837097,
0.9911155700683594,
0.3412468135356903,
0.6755512356758118,
0.6587533354759216,
0.007913460955023766,
0.34221789240837097,
0.3244488537311554,
0.3412468135356903,
0.008884529583156109,
0.6587533354759216,
0.007913422770798206,
0.008884549140930176,
0.324448823928833,
0.007913422770798206,
0.32541996240615845,
0.3244488537311554,
0.675551176071167,
0.32541996240615845,
0.6745801568031311,
0.008884529583156109,
0.9911155700683594,
0.00791349820792675,
0.6577821969985962,
0.007913422770798206,
0.6587533354759216,
0.3244488835334778,
0.34221789240837097,
0.32541996240615845,
0.3422178626060486,
0.6587533354759216,
0.3412467837333679,
0.34221789240837097,
0.6577821373939514,
0.3412468135356903,
0.9911155700683594,
0.3412468135356903,
0.99208664894104,
0.6577821969985962,
0.6755512356758118,
0.6587533354759216
]
}
]
ich nicht bin derzeit nach Möglichkeiten, eine machen Besser mehr Feature gefüllt, oder effizienter Exporteur, eher möchte ich nur fina Ich zerquetsche diesen Fehler, damit ich zu interessanteren Dingen kommen kann, wie zum Beispiel ein WebGL-Spiel zu machen und etwas über Kollisionserkennung und ähnliches zu lernen. Jede Hilfe oder Beratung in Bezug auf dieses Problem würde ich sehr schätzen!
Edit:
Im Fall könnte es meine Rendering-Code, und nicht der Exporteur sein, dass das Problem ist, hier ist der Teil Code meines WebGL in Bezug auf die Puffer initialisiert und Zeichnen der Szene (eine modifizierte Version von Code bei http://learningwebgl.com gefunden):
var gl;
var current_shader_program;
var per_vertex_shader_program;
var per_fragment_shader_program;
var modelview_matrix = mat4.create();
var modelview_matrix_stack = [];
var projection_matrix = mat4.create();
var teapot_vertex_position_buffer = new Array();
var teapot_vertex_tex_coord_buffer = new Array();
var teapot_vertex_normal_buffer = new Array();
var teapot_vertex_index_buffer = new Array();
var earth_texture;
var galvanized_texture;
var teapot_angle = 180;
var last_time = 0;
function createProgram(vertex_shader_filename, fragment_shader_filename) {
var vertex_shader_text = readFromUrl(vertex_shader_filename);
var fragment_shader_text = readFromUrl(fragment_shader_filename);
var vertex_shader = gl.createShader(gl.VERTEX_SHADER);
var fragment_shader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(vertex_shader, vertex_shader_text);
gl.shaderSource(fragment_shader, fragment_shader_text);
gl.compileShader(vertex_shader);
if (!gl.getShaderParameter(vertex_shader, gl.COMPILE_STATUS)) {
alert(gl.getShaderInfoLog(vertex_shader));
}
gl.compileShader(fragment_shader);
if (!gl.getShaderParameter(fragment_shader, gl.COMPILE_STATUS)) {
alert(gl.getShaderInfoLog(fragment_shader));
}
var shader_program = gl.createProgram();
gl.attachShader(shader_program, vertex_shader);
gl.attachShader(shader_program, fragment_shader);
gl.linkProgram(shader_program);
if (!gl.getProgramParameter(shader_program, gl.LINK_STATUS)) {
alert("Error: Unable to link shaders!");
}
shader_program.vertex_position_attribute =
gl.getAttribLocation(shader_program, "a_vertex_position");
gl.enableVertexAttribArray(shader_program.vertex_position_attribute);
shader_program.vertex_normal_attribute =
gl.getAttribLocation(shader_program, "a_vertex_normal");
gl.enableVertexAttribArray(shader_program.vertex_normal_attribute);
shader_program.tex_coord_attribute =
gl.getAttribLocation(shader_program, "a_tex_coord");
gl.enableVertexAttribArray(shader_program.tex_coord_attribute);
shader_program.projection_matrix_uniform =
gl.getUniformLocation(shader_program, "u_projection_matrix");
shader_program.modelview_matrix_uniform =
gl.getUniformLocation(shader_program, "u_modelview_matrix");
shader_program.normal_matrix_uniform =
gl.getUniformLocation(shader_program, "u_normal_matrix");
shader_program.sampler_uniform =
gl.getUniformLocation(shader_program, "u_sampler");
shader_program.material_shininess_uniform =
gl.getUniformLocation(shader_program, "u_material_shininess");
shader_program.show_specular_highlights_uniform =
gl.getUniformLocation(shader_program, "u_show_specular_highlights");
shader_program.use_textures_uniform =
gl.getUniformLocation(shader_program, "u_use_textures");
shader_program.use_lighting_uniform =
gl.getUniformLocation(shader_program, "u_use_lighting");
shader_program.ambient_color_uniform =
gl.getUniformLocation(shader_program, "u_ambient_color");
shader_program.point_lighting_location_uniform =
gl.getUniformLocation(shader_program, "u_point_lighting_location");
shader_program.point_lighting_specular_color_uniform =
gl.getUniformLocation(shader_program, "u_point_lighting_specular_color");
shader_program.point_lighting_diffuse_color_uniform =
gl.getUniformLocation(shader_program, "u_point_lighting_diffuse_color");
return shader_program;
}
function initShaders() {
per_fragment_shader_program = createProgram("per_fragment_lighting.vs", "per_fragment_lighting.fs");
}
function handleLoadedTexture(texture) {
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE,
texture.image);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
gl.generateMipmap(gl.TEXTURE_2D);
gl.bindTexture(gl.TEXTURE_2D, null);
}
function initTextures() {
earth_texture = gl.createTexture();
earth_texture.image = new Image();
earth_texture.image.onload = function() {
handleLoadedTexture(earth_texture);
}
earth_texture.image.src = "earth.jpg";
galvanized_texture = gl.createTexture();
galvanized_texture.image = new Image();
galvanized_texture.image.onload = function() {
handleLoadedTexture(galvanized_texture);
};
galvanized_texture.image.src = "galvanized.jpg";
}
function setMatrixUniforms() {
gl.uniformMatrix4fv(current_shader_program.projection_matrix_uniform, false,
projection_matrix);
gl.uniformMatrix4fv(current_shader_program.modelview_matrix_uniform, false,
modelview_matrix);
var normal_matrix = mat3.create();
mat4.toInverseMat3(modelview_matrix, normal_matrix);
mat3.transpose(normal_matrix);
gl.uniformMatrix3fv(current_shader_program.normal_matrix_uniform, false,
normal_matrix);
}
function handleLoadedTeapot(teapot_data) {
for (var i = 0; i < teapot_data.length; i++)
{
teapot_vertex_normal_buffer[i] = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, teapot_vertex_normal_buffer[i]);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(teapot_data[i].normals),
gl.STATIC_DRAW);
teapot_vertex_normal_buffer[i].item_size = 3;
teapot_vertex_normal_buffer[i].num_items =
teapot_data[i].normals.length/teapot_vertex_normal_buffer[i].item_size;
teapot_vertex_tex_coord_buffer[i] = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, teapot_vertex_tex_coord_buffer[i]);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(teapot_data[i].tex_coords),
gl.STATIC_DRAW);
teapot_vertex_tex_coord_buffer[i].item_size = 2;
teapot_vertex_tex_coord_buffer[i].num_items =
teapot_data[i].tex_coords.length/teapot_vertex_tex_coord_buffer[i].item_size;
teapot_vertex_position_buffer[i] = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, teapot_vertex_position_buffer[i]);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(teapot_data[i].vertices),
gl.STATIC_DRAW);
teapot_vertex_position_buffer[i].item_size = 3;
teapot_vertex_position_buffer[i].num_items =
teapot_data[i].vertices.length/teapot_vertex_position_buffer[i].item_size;
teapot_vertex_index_buffer[i] = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, teapot_vertex_index_buffer[i]);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(teapot_data[i].indices),
gl.STATIC_DRAW)
teapot_vertex_index_buffer[i].item_size = 1;
teapot_vertex_index_buffer[i].num_items =
teapot_data[i].indices.length/teapot_vertex_index_buffer[i].item_size;
}
document.getElementById("loading_text").textContent = "";
}
function loadTeapot() {
var request = new XMLHttpRequest();
request.open("GET", "untitled.json");
request.onreadystatechange = function() {
if (request.readyState == 4) {
handleLoadedTeapot(JSON.parse(request.responseText));
}
};
request.send();
}
function drawScene() {
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
if (teapot_vertex_position_buffer[0] == null ||
teapot_vertex_normal_buffer[0] == null ||
teapot_vertex_tex_coord_buffer[0] == null ||
teapot_vertex_index_buffer[0] == null) {
return;
}
current_shader_program = per_fragment_shader_program;
gl.useProgram(current_shader_program);
var specular_highlights = document.getElementById("specular").checked;
gl.uniform1i(current_shader_program.show_specular_highlights_uniform, specular_highlights);
var lighting = document.getElementById("lighting").checked;
gl.uniform1i(current_shader_program.use_lighting_uniform, lighting);
if (lighting) {
gl.uniform3f(current_shader_program.ambient_color_uniform,
parseFloat(document.getElementById("ambient_r").value),
parseFloat(document.getElementById("ambient_g").value),
parseFloat(document.getElementById("ambient_b").value));
gl.uniform3f(current_shader_program.point_lighting_location_uniform,
parseFloat(document.getElementById("light_pos_x").value),
parseFloat(document.getElementById("light_pos_y").value),
parseFloat(document.getElementById("light_pos_z").value));
gl.uniform3f(current_shader_program.point_lighting_specular_color_uniform,
parseFloat(document.getElementById("specular_r").value),
parseFloat(document.getElementById("specular_g").value),
parseFloat(document.getElementById("specular_b").value));
gl.uniform3f(current_shader_program.point_lighting_diffuse_color_uniform,
parseFloat(document.getElementById("diffuse_r").value),
parseFloat(document.getElementById("diffuse_g").value),
parseFloat(document.getElementById("diffuse_b").value));
}
var texture = document.getElementById("texture").value;
gl.uniform1i(current_shader_program.use_textures_uniform, texture != "none");
mat4.identity(modelview_matrix);
mat4.translate(modelview_matrix, [0, 0, -10]);
mat4.rotate(modelview_matrix, degToRad(23.4), [1, 0, 0]);
mat4.rotate(modelview_matrix, degToRad(teapot_angle), [0, 1, 0]);
gl.activeTexture(gl.TEXTURE0);
if (texture == "earth") {
gl.bindTexture(gl.TEXTURE_2D, earth_texture);
}
else if (texture == "galvanized") {
gl.bindTexture(gl.TEXTURE_2D, galvanized_texture);
}
gl.uniform1i(current_shader_program.sampler_uniform, 0);
gl.uniform1f(current_shader_program.material_shininess_uniform,
parseFloat(document.getElementById("shininess").value));
for (var i = 0; i < teapot_vertex_position_buffer.length; i++)
{
gl.bindBuffer(gl.ARRAY_BUFFER, teapot_vertex_position_buffer[i]);
gl.vertexAttribPointer(current_shader_program.vertex_position_attribute,
teapot_vertex_position_buffer[i].item_size, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ARRAY_BUFFER, teapot_vertex_tex_coord_buffer[i]);
gl.vertexAttribPointer(current_shader_program.tex_coord_attribute,
teapot_vertex_tex_coord_buffer[i].item_size, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ARRAY_BUFFER, teapot_vertex_normal_buffer[i]);
gl.vertexAttribPointer(current_shader_program.vertex_normal_attribute,
teapot_vertex_normal_buffer[i].item_size, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, teapot_vertex_index_buffer[i]);
setMatrixUniforms();
gl.drawElements(gl.TRIANGLES, teapot_vertex_index_buffer[i].num_items,
gl.UNSIGNED_SHORT, 0);
}
}
ich weiß, dass es eine verdammt viel ist durch zu suchen, weshalb ich es nicht vor Post hat, aber es hat einen Vorschlag, dass die Rendering-Code gewesen sein könnte sei schuld. Beachten Sie, dass die im Code erwähnte "Teekanne" wirklich das exportierte Modell ist (der Würfel, den ich zu rendern versuche).
Nicht mein Feld, also kann ich nicht helfen, aber ein +1 für eine gute Frage, wenn das ein Trost ist –
Ich glaube nicht, dass Sie einfach die Y- und Z-Positionen tauschen können, die UVs immer noch 100% korrekt zu sein. – Grimmy
Das macht Sinn, aber wenn das der Fall ist, wie würde ich dann eine -Z-Vorwärts-, Y-Hoch-Ausrichtung mit gültigen Texturkoordinaten erreichen? – Defcronyke