insertAlongUV 操作

语法

  • insertAlongUV(uvSet, filePath, height)
  • insertAlongUV(uvSet, filePath, height, heightDirection, heightAlignment)

参数

  1. uvSet - float
    纹理坐标集编号(介于 [0,9] 之间的整数)。 编号与材料属性的纹理图层相对应,另请参阅纹理:基本知识
  2. filePath - string
    要插入的几何资产的文件路径。 有关搜索位置的信息,请参阅资产搜索。 有关插入操作受支持的资产格式的备注在此同样适用。
  3. height - float
    插入的几何的高度,采用世界坐标系。
  4. heightDirection - selector
    • scope.y - 高度沿范围 y 轴(默认)投影。 用于示例 alignScopeToAxesalignScopeToGeometry 以调整 y 轴。
    • vertex.normal - 高度将沿当前形状的(内插)折点法线进行投影。
      注:

      始终根据当前形状的几何计算折点法线;将丢弃现有折点法线。 如果面断开连接,则必须合并重复折点,才能使用相邻面法线计算折点法线。

  5. heightAlignment - selector
    • alignPosition - 资产将置于当前形状的面(默认)上。
    • keepPosition - 资产沿高度维度的位置相对于其原点放置。

描述

insertAlongUV 用于从文件中读取几何资产(3D 模型、面网格),然后通过将资产的宽度和深度映射到所选 uv 集沿当前形状的 uv 坐标将其插入。 具体如下:

  • 资产的 x 跨度映射至 u(范围介于 [0,1] 之间)并进行重复,
  • z 跨度映射至 -v,
  • y 跨度设置为所选 height 参数。
在资产已映射的情况下沿 UV 插入

将根据适合初始形状的 uv 空间的新几何对资产进行剪切和弯曲。

在已分配 uv 集的形状上,使用分割以及 normalizeUVrotateUVscaleUV 等纹理操作可根据需求设置 uv。

在资产已剪切的情况下沿 UV 插入

注:

资产仅映射到当前形状的三角形和四边形上。

注意事项

  • 新几何不会继承资产的折点法线。 可使用 setNormalssoftenNormals 重新计算折点法线。
  • 资产需要剪切才能适合 uv 空间。 这将创建可使用 cleanupGeometry 移除的共面边和共线折点。
  • 插入操作不同,创建新几何会中断实例化。 此外,不会自动应用修剪。

相关内容

示例

街道

道路障碍资产沿街道形状的 uv 坐标进行插入。

const width  = assetInfo("barrier.obj", sx)
const height = assetInfo("barrier.obj", sy)

Street --> split(v, unitSpace, 0) {
               width : InsertBarrier |
               ~1    : Street.       |
               width : InsertBarrier |
               ~1    : Street.       |
               width : InsertBarrier }

InsertBarrier -->
    rotateUV(0, 90)
    normalizeUV(0, u, collectiveAllFaces)
    insertAlongUV(0, "barrier.obj", height)
具有 InsertBarrier 的街道已插入道路障碍

如果资产定向为 x 与 u 反向对应,则不需要 rotateUV(),以下更改产生的结果与上面相同。

const width = assetInfo("barrier.obj", sz)
	           
InsertBarrier -->
    normalizeUV(0, u, collectiveAllFaces)
    insertAlongUV(0, "barrier.obj", height)
没有 rotateUV 的 InsertBarrier

使用 alignScopeToAxes(y) 可确保护栏沿上坡街道形状的 uv 坐标插入时保持竖直。 tileUV 会导致资产重复。

const width  = assetInfo("guardrail.obj", sx)
const height = assetInfo("guardrail.obj", sy)
const depth  = assetInfo("guardrail.obj", sz)

Street -->
    alignScopeToAxes(y)
    split(v, unitSpace, 0) { depth : rotateUV(0, 180)
                                     InsertGuardrail
                           |    ~1 : NIL
                           | depth : InsertGuardrail }

InsertGuardrail -->
    normalizeUV(0, v, collectiveAllFaces)
    tileUV(0, ~width, 0)
    insertAlongUV(0, "guardrail.obj", height)
插入护栏

重复几何

平面形状沿其 uv 坐标进行分割,并在每个分割结点处插入球体资产。 要获得类似的结果,可通过转换 uv 坐标并沿 uv 坐标插入球体资产。 与第一个示例相反,这仅创建一个叶形状。

Example1 --> split(u, uvSpace, 0) { '0.25 :
             split(v, uvSpace, 0) { '0.25 :
                 s('1, 2.5, '1)
                 i("sphere.obj")
                 Sphere.
             }* }*

Example2 --> scaleUV(0, 4.0, 4.0)
             insertAlongUV(0, "sphere.obj", 2.5)
             setNormals(auto)
已插入球体

树模型将根据 uv 范围进行插入,并使用组件分割提取树干。

Lot -->
    setupProjection(0, scope.zx, '0.25, '0.25)
    projectUV(0)
    Texture
    insertAlongUV(0, "Orange_Tree_Analytical_0.obj", 25)
    comp(g) { 0 : set(material.opacity, 0.1)
                  Foliage. |
              1 : Trunk. }
              
Texture -->
    texture("builtin:uvtest.png")
已插入树模型

曲面

insertAlongUV 操作也可以用于创建弯曲窗户。 通过使用 vertex.normal 选项,窗户资产将绕圆柱弯曲。 keepPosition 选项会相对于资产原点对其进行放置。

const asset = "windowAligned.obj"
const sy    = assetInfo(asset, sy)
const sx    = assetInfo(asset, sx)
const sz    = assetInfo(asset, sz)

Lot -->
    primitiveCylinder(32, 2, 4)
    comp(f) { side = Side | all = Endcaps. }
	
Side -->
    split(u, unitSpace, 0) { sx : Split | 
                            ~1.5 : Wall. }*
           
Split -->
    split(y) { ~1: Wall. | sz: Window | 
                           ~1: Wall. }

Window -->
    normalizeUV(0, uv, collectiveAllFaces)
    insertAlongUV(0, asset, sy, vertex.normal, 
                  keepPosition)
    color("#804000")
创建弯曲窗户

在此示例中,2D 和 3D 资产在曲面上重复插入。 请注意,height 参数可设置为正值、零和负值。

Sphere -->
    primitiveSphere()
    scaleUV(0, 10, 10)
    split(y) { ~1 : 
                insertAlongUV(0,  "pyramid.obj",   
                0.5, vertex.normal, alignPosition)
                color(1,0.5,0.5)
                Pyramids.
             | ~1 : 
                insertAlongUV(0, "circles2D.obj",  
                0, vertex.normal, alignPosition)
                color(0.5,1,0.5)
                Circles2D.
             | ~1 : 
                insertAlongUV(0, "circles3D.obj", 
                -0.5, vertex.normal, alignPosition)
                color(0.5,0.5,1) 
                Circles3D. }
在球体内创建球体