【发布时间】:2020-02-25 07:36:05
【问题描述】:
我正在开发一个系统来为“地雷”构建网格,现在我不想实现视觉完美,我更专注于基础。
我知道我能够生成地雷的形状,并由此生成 2 个网格,一个用于地面,一个用于矿井的“墙壁”。
现在我正在努力正确映射 UV,但我的问题是地面真的很难正确映射到 UV 坐标,我目前无法正确映射。 对于镶嵌,我使用的是 delaunay 三角剖分的约束版本,我在其中添加了一个子镶嵌,它简单地将三角形至少分割一次,如果三角形的面积大于 X,则继续分割它们。
这里是 3D 渲染的结果(使用 three.js 和 webgl),并应用了我当前的 UV 贴图(还有置换贴图,请暂时忽略它)。
我对 UV 映射采用了一种简单的方法,网格中三角形的每个顶点都被转换为 0 到 1 之间的值,仅此而已。 我认为,理论上应该是正确的,但问题在于产生问题的顶点的顺序,但如果是这种情况,纹理应该显示为旋转或奇怪,而不仅仅是奇怪地像那样拉伸。
一旦我得到正确的 UV 映射,下一步就是正确实现
我目前正在用 javascript 编写此代码,但任何语言的任何提示或解决方案都可以,我不介意对其进行转换和/或重新设计以使其工作。
我的目标是能够以程序方式构建网格,将其发送给多个客户端并实现相同的视觉渲染。在执行此其他步骤后,我需要添加很多零碎的东西,因此我不能依赖客户端的着色器,否则服务器无法在地面上放置轨道、推车或其他东西. 一旦我将这些事情整理好,我将切换到 Unity 3D 进行客户端渲染,目前使用 webgl 和 three.js 只是为了有一种快速简便的方法来查看正在生成的内容,而无需客户端/服务器整个基础架构。
有什么建议吗?
谢谢!
【问题讨论】:
-
您好 Daniele,我会将其写为评论,因为它不是一个完美的答案,我不确定它是否真的满足您的需求。但是,您是否考虑过仅基于边界框(p.x / 宽度,p.y / 高度)对位置进行归一化并将其用作 UV?基本上是平面UV贴图。这种方法将导致纹理线的范围从 0 到 1,并且其值与顶点相对距离有关。几乎像阿特拉斯。如果这看起来可以接受,请告诉我,如果您愿意,我很乐意发布答案。
-
正如 diogoslima 所说,三平面投影应该可以解决问题,所以你真的不需要用 uv 坐标来搞乱它(这里你有一个关于如何在 Unity 中实现它的好教程:@987654323 @)
-
对于这种平坦的地板,您可以只使用顶点坐标作为 UV。假设您的 X 和 Y 轴在地板上并且 Z 指向上方,您可以从 (X,Y) 截断整数值并将结果用作 (U,V)。所以
2.3的值变成了0.3等等。 -
感谢 cmets!这正是我正在做的事情,我期待它能够正常工作,但显然映射中存在问题。确切地说,在发布的最后一张图片中,是从 52x52 地图(范围从 -1 到 51)构建的,并且坐标使用简单的比例(在本例中为 U = (X + 1) / 52 ... ) 但结果是上面那个奇怪的。即使没有应用置换贴图(当然不应该改变任何东西),结果也是一样的。三角形顶点的顺序会影响纹理的映射方式吗?
-
哈哈,有趣的@DanieleSalvatoreAlbano!由于我掌握的信息很少,这更像是一种猜测,但是: * 如果您已经在使用 Unity 进行渲染,请查看Continuous tiling * 如果您有自定义着色器,您可以只设置颜色 R 和 B到 U 和 V 值。如果映射正确,这将使视觉清晰,因为您将看到定义明确的多色渐变。
标签: javascript unity3d 3d heightmap tessellation