我目前正在开展一个项目,在这个项目中,人们应该能够在运行时加载自己的模型并在其上行走。为此,我想缩小网格以适应容器,这将是水平区域。
我使用ObjImporter
让导入部分工作,但我似乎无法弄清楚如何缩小导入的网格以适应框。
这是我到目前为止所尝试的:
public void ModelPicker() {
Mesh mesh = new Mesh();
//Choose an Obj or dxf file
string filePath = UnityEditor.EditorUtility.OpenFilePanel ("Select model","C:\\", "obj;*.dxf;" );
if(filePath != "") {
string[] extention = filePath.Split ('.'); //Get the extention of the chosen file
string[] filename = filePath.Split ('/'); // Get the file name + extention of the chosen file
if (extention [extention.Length - 1] == "obj") { //If the file had an "obj" extention, use ObjImporter
mesh = OI.ImportFile (filePath);
} else if (extention [extention.Length - 1] == "dxf") { //If the file had an "dxf" extention, use DxfToMesh
//TODO mesh = DxfToMesh (filePath);
} else {
GameObject.Find ("FilePathText").GetComponent<UnityEngine.UI.Text> ().text = "Format not supported."; //if the file had an unsupported extention
}
if (mesh != null) {
GameObject em = GameObject.Find ("emptyModel");
em.GetComponent<MeshFilter> ().mesh = mesh; //Display the loaded model
GameObject.Find ("FilePathText").GetComponent<UnityEngine.UI.Text> ().text = filename[filename.Length -1]; //Display filename
//Should decrease size to fit in the box
int counter = 0; // to make sure the loop will end eventually
em.renderer.bounds.SetMinMax(em.transform.parent.collider.bounds.min, em.transform.parent.collider.bounds.max);
Debug.Log("max: " + em.renderer.bounds.max + " | min: " + em.renderer.bounds.min);
Debug.Log("parent max: " + em.transform.collider.bounds.max + " | parent min: " + em.transform.collider.bounds.min);
while(em.renderer.collider.bounds.Intersects(em.transform.parent.collider.bounds) && counter < 100)
{
Debug.Log (em.transform.localScale );
em.transform.localScale *= 0.9f;
counter++;
if(counter == 100) {
Debug.Log("max: " + em.renderer.bounds.max + " | min: " + em.renderer.bounds.min);
}
}
GameObject.Find("SimulateButton").GetComponent<Button>().interactable = true;
}
}
}
emptyModel
是包含导入模型的GameObject。它有一个带有boxcollider且没有网格的父级。
答案 0 :(得分:2)
我可以从网格的extends
中获取x,y,z值以获得最远的点。然后在while
循环中检查这些点是否都在父项的bounds
中。如果它们不在bounds
范围内,我将比例乘以0.9。然后它会重复,直到它适合方框
public void ModelPicker() {
Mesh mesh = new Mesh();
//Choose an Obj or dxf file
string filePath = UnityEditor.EditorUtility.OpenFilePanel ("Select model","C:\\", "obj;*.dxf;" );
if(filePath != "") {
string[] extention = filePath.Split ('.'); //Get the extention of the chosen file
string[] filename = filePath.Split ('/'); // Get the file name + extention of the chosen file
if (extention [extention.Length - 1] == "obj") { //If the file had an "obj" extention, use ObjImporter
mesh = OI.ImportFile (filePath);
} else if (extention [extention.Length - 1] == "dxf") { //If the file had an "dxf" extention, use DxfToMesh
// mesh = DxfToMesh (filePath);
} else {
GameObject.Find ("FilePathText").GetComponent<UnityEngine.UI.Text> ().text = "Format not supported."; //if the file had an unsupported extention
}
if (mesh != null) {
GameObject em = GameObject.Find ("emptyModel");
em.transform.localScale = new Vector3(1,1,1);
em.GetComponent<MeshFilter> ().mesh = mesh; //Display the loaded model
GameObject.Find ("FilePathText").GetComponent<UnityEngine.UI.Text> ().text = filename[filename.Length -1]; //Display filename
Vector3 parentSize = em.transform.parent.GetComponent<BoxCollider>().bounds.size;
while(em.transform.GetComponent<MeshFilter>().renderer.bounds.extents.x > parentSize.x ||
em.transform.GetComponent<MeshFilter>().renderer.bounds.extents.y > parentSize.y ||
em.transform.GetComponent<MeshFilter>().renderer.bounds.extents.z > parentSize.z
) {
em.transform.localScale *= 0.9f;
}
GameObject.Find("SimulateButton").GetComponent<Button>().interactable = true;
}
}
}