How to fix this cube ?
I have imported cube with texture from Blender and it imports like that. When I place it, it looks normal, but when I generate it through the code it appears like in the inspector.
1.png
(45.8 kB)
Comment
Answer by Monkiman300 · Aug 22, 2016 at 10:34 AM
You would need the following script. I dont remember where I got it from, but it makes the Blender models right side up for me. Just make sure to put it in the "Editor" folder and whatnot.
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using System.Linq;
public class BlenderAssetProcessor : AssetPostprocessor {
public void OnPostprocessModel(GameObject obj )
{
//only perform corrections with blender files
ModelImporter importer = assetImporter as ModelImporter;
if (Path.GetExtension(importer.assetPath) == ".blend")
{
RotateObject(obj.transform);
}
//Don't know why we need this...
//Fixes wrong parent rotation
obj.transform.rotation = Quaternion.identity;
}
//recursively rotate a object tree individualy
private void RotateObject(Transform obj )
{
Vector3 objRotation = obj.eulerAngles;
objRotation.x += 90f;
obj.eulerAngles = objRotation;
//if a meshFilter is attached, we rotate the vertex mesh data
MeshFilter meshFilter = obj.GetComponent(typeof(MeshFilter)) as MeshFilter;
if (meshFilter)
{
RotateMesh(meshFilter.sharedMesh);
}
//do this too for all our children
//Casting is done to get rid of implicit downcast errors
foreach (Transform child in obj)
{
RotateObject(child);
}
}
//"rotate" the mesh data
private void RotateMesh(Mesh mesh)
{
int index = 0;
//switch all vertex z values with y values
Vector3[] vertices = mesh.vertices;
for (index = 0; index < vertices.Length; index++)
{
vertices[index] = new Vector3(vertices[index].x, vertices[index].z, vertices[index].y);
}
mesh.vertices = vertices;
//for each submesh, we invert the order of vertices for all triangles
//for some reason changing the vertex positions flips all the normals???
for (int submesh = 0; submesh < mesh.subMeshCount; submesh++)
{
int[] triangles = mesh.GetTriangles(submesh);
for (index = 0; index < triangles.Length; index += 3)
{
int intermediate = triangles[index];
triangles[index] = triangles[index + 2];
triangles[index + 2] = intermediate;
}
mesh.SetTriangles(triangles, submesh);
}
//recalculate other relevant mesh data
mesh.RecalculateNormals();
mesh.RecalculateBounds();
}
}
Your answer
![](https://koobas.hobune.stream/wayback/20220612091251im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Instantiate a prefab of a Blender model w/ Behavior that supports changes to model 0 Answers
Imported Models Not Rendering Correctly? 5 Answers
Normal map seams 0 Answers
Blender to Unity armature not in correct place... 1 Answer
Can faces be made visable from both sides on assets from blender. 1 Answer