【问题标题】:Texture Mapping?纹理映射?
【发布时间】:2015-10-12 06:54:21
【问题描述】:
我有一个任务,我必须执行以下操作:
在一个场景中创建至少 5 个 UI 对象和 3 个 3D 对象,然后导入
每个至少有 8 个不同的纹理图像文件。如果你
只想创建 3 个 3D 对象,它们必须是一个立方体,一个
球体和一个圆柱体。为对象分配不同的纹理。
-
编写一个脚本来读取场景中所有用作纹理的图像文件的信息,并生成一个包含场景中所有使用的纹理图像文件的单个纹理图像文件。
李>
扩展上面编写的脚本文件,以便能够自动正确地将新的单个纹理图像文件映射到所有纹理对象。
我很确定我可以毫无问题地完成第一个,但我不确定脚本部分。我查看了有关该主题的教程,但他们只谈论将纹理应用于对象,而没有谈论脚本。有谁知道任何可以帮助我学习这部分的视频或网页?
【问题讨论】:
标签:
unity3d
texture-mapping
【解决方案1】:
可以通过使用 GameObject[] allObjects = UnityEngine.Object.FindObjectsOfType<GameObject>() 遍历场景中的每个 GameObject,然后通过访问它们各自的 Material.mainTexture 属性 (doc) 来获取它们的 Texture2D,从而实现第 2 个,这将给出一个包含所有使用Texture2Ds。下一部分
并生成单个纹理图像文件,其中包含场景中所有使用的纹理图像文件
模棱两可。它可以以您认为合适的任何方式完成,生成一个纹理图像,例如通过将它们全部排成一排左右。然而,这可能引用了纹理图集功能,在这种情况下,您需要查看Texture2D.PackTextures 函数,对here。这个函数会将所有给定的纹理(Texture2D[])打包到一个单一的图集中,并将返回一个 UV 坐标数组给您。
退货
Rect[] 一个矩形数组,其中包含每个输入纹理在图集中的 UV 坐标,如果打包失败,则为 null。
这是解决数字 3 的关键。
如果您将生成的打包纹理分配回 sene 中的 3D 对象,则 UV 坐标必须正确,这样您将只能看到它在开始时具有的纹理部分。将正确的 UV 坐标从Rect[]PackTextures() 函数提供给您的对象分配回(一个矩形中有两个Vector2,一个是X/Y(顶点),另一个是U-V (tex-coord) 你需要),任务应该得到解决。
(UV部分参考:http://answers.unity3d.com/questions/276212/what-is-the-simple-way-of-applying-texture-atlas-t.html)