在Unity中,我(以编程方式)创建了一个平面的“堆栈”--每个平面上都有一个图像。我希望能够拿着相机放大堆栈,当它在堆栈中放大时,可以看到每一张图像。
想象一下,当你通过一个俄罗斯Matryoshka玩偶拍摄时,你可以看到每个较小的玩偶。
同样重要的是要注意,在我的例子中,平面堆栈并不是完全对齐的,因此它们中的一些会稍微相交-我需要确保它们不会闪烁。
我想将这些平面组合成一个单独的“模型”(网格可能是正确的术语,但使用这个视频:https://www.youtube.com/watch?v=6APzUgckV7U不起作用-它取走我所有的平面并将其简单地转换为一个平面;也就是说,我可以组合这些平面,但它用单一材料创建了一个单一的对象)。这使用了网格组合器,但我不确定这是正确的方法。
这是我写的一些代码,它将所有的平面从slicesHolder中提取出来,并将它们组合成一个“模型”。然后它将“模型”放在finalObject中,但不幸的是,“模型”没有保留切片中的任何材料(图像)。然后slicesHolder就被摧毁了。
Quaternion oldRot = slicesHolder.transform.rotation;
Vector3 oldPos = slicesHolder.transform.position;
finalObject.transform.rotation = Quaternion.identity;
finalObject.transform.position = Vector3.zero;
MeshFilter[] meshFilters = slicesHolder.GetComponentsInChildren<MeshFilter>();
Debug.Log("Combining " + meshFilters.Length + " meshes");
Mesh finalMesh = new Mesh();
CombineInstance[] combiners = new CombineInstance[meshFilters.Length];
for(int a = 0; a < meshFilters.Length; a++){
//if(meshFilters[a].transform == transform)
//continue;
combiners[a].subMeshIndex = 0;
combiners[a].mesh = meshFilters[a].sharedMesh;
combiners[a].transform = meshFilters[a].transform.localToWorldMatrix;
}
finalMesh.CombineMeshes(combiners);
finalObject.GetComponent<MeshFilter>().sharedMesh = finalMesh;
finalObject.transform.rotation = oldRot;
finalObject.transform.position = oldPos;
Destroy(slicesHolder);
finalObject.SetActive(true);这是尝试创建一个单一的“模型”的正确方式吗?这个“模型”有一个单独的图像“堆栈”,这样我就可以放大这个堆栈,看到模型的更深层次?
发布于 2019-05-26 11:15:43
没有有效的方法来做到这一点。
其中的原因就是纹理。或者更具体地说是材料。因为每个平面都有一个唯一的材质实例,所以无法将其与另一个平面组合。你要么以开始时的方式结束,要么只使用每个面上的一个纹理得到一个组合模型。
您需要一种将每个所需纹理映射到精灵工作表的方法,使用该精灵工作表创建一个新材质,然后找出要从一种材质转换为精灵工作表材质的UV偏移,将精灵工作表材质指定给所有平面,然后对它们进行网格组合。
https://stackoverflow.com/questions/56309516
复制相似问题