setupprojection

setupprojection

概要

  • setupProjection (uvSet,axesSelector,texWidth,texHeight)
  • setupProjection (uvSet,axesSelector,texWidth,texHeight,widthOffset,heightOffset)
  • setupProjection (uvSet,axesSelector,texWidth,texHeight,widthOffset,heightOffset,uwFactor)

参数

  1. uvSet –整数(范围[0,5])
    要设置的uv-set(纹理图层)的索引。编号对应于材质属性的纹理图层。
  2. axesSelector – selstr
    描述原点以及哪些轴被视为u轴和v轴。可能的值:
    • scope.xy | scope.xz | scope.yx | scope.yz | scope.zx | scope.zy } – 选择范围原点及其两个轴。
    • world.xy | world.xz | world.yx | world.yz | world.zx | world.zy } – 选择世界原点和两个轴。
  3. texWidth –浮点数
    世界坐标系单位(例如米)的纹理宽度。允许值<0并镜像纹理。可以使用运算符〜(浮动)和’(相对)。
  4. texHeight –浮动
    世界坐标系单位(例如米)中的纹理texHeight。允许值<0并镜像纹理。可以使用运算符〜(浮动)和’(相对),见下文。
  5. widthOffset – float
    u方向的偏移量,以世界坐标系单位(例如米)表示。
  6. heightOffset – float
    v方向的偏移量,以世界坐标系单位(例如米)表示。
  7. uwFactor –浮动
    设置纹理在w轴上相对于u轴应用的因子(请参见下面的示例)。默认值为0。

描述

所述setupProjection操作初始化基于参考对于所选择的UV-集的投影矩阵坐标与指定的系统axesSelector。它可以在范围和世界坐标系之间进行选择。例如,为了初始化u和v轴与x轴和当前范围的y轴的axesSelector必须被设置为scope.xy。请注意,某些组合会产生镜像纹理。

texWidthtexHeight参数支持浮动和相对运营商的使用,以避免与范围维复杂的计算,类似于变换和分割操作。例如,如果参数texWidth设置为~2,则初始化投影矩阵,使得当前范围宽度精确地跨越大小为2的纹理图块。或者如果参数texHeight设置为’0.5,则纹理将是沿着高度重复两次。

可选地,可以设置像素的z坐标对w纹理坐标相对于u坐标的影响。请注意,如果未提供,则默认为0。

有关

例子

建筑物的标准纹理

默认用例

第一个规则片段显示了如何在外观规则中使用setupProjection操作来定义纹理坐标系(也称为“uv​​w”系统以避免与几何体的xyz系统混淆)以用于后续的projectUV操作(=纹理投影)。

Lot -->
    ... Building
    
Building -->
    ... Frontfacade ...
    
Frontfacade -->
    setupProjection(0, scope.xy, 1.5, 1, 1) # setup 1.5m x 1m texture tiles 
    setupProjection(2, scope.xy, scope.sx, scope.sy, 1)  # using dirtmap (uvSet #2)	

    split(y){ groundfloor_height    : Groundfloor 
            | {~floor_height        : Floor}* }

在第二个片段中,我们展示了projectUV操作如何计算墙资产的新纹理坐标。已替换此通道上已存在的纹理坐标。projectUV使用之前由setupProjection定义的uvw坐标系,并沿w轴投影资产顶点以获取新的纹理坐标。

... rules for floors and facade tiles ...
Wall -->
    color(wallColor)
    set(material.colormap, wall_tex)  
    set(material.dirtmap, dirt_tex)
    projectUV(0) projectUV(2)

相反,请注意门的规则如何不使用任何projectUV操作来应用纹理,它只使用立方体资产中的通用纹理坐标。

Door -->
    s('1,'1,0.1)
    t(0,0,-0.5)
    set(material.colormap, frontdoor_tex)    
    primitiveCube()
范围与setupUV

 

这是一个例子,如果我们把setupProjection旁边命令projectUV在门面上的级别规则。

Frontfacade -->
   setupProjection(0, scope.xy, 1.5, 1, 1) 
   setupProjection(2, scope.xy, scope.sx, scope.sy, 1)  
  ...
Wall -->
   color(wallColor)
   set(material.colormap, wall_tex)
   set(material.dirtmap, dirt_tex)
   projectUV(0) projectUV(2)
Facade with setupProjection

当 setupProjection命令位于墙规则上的projectUV旁边时,砖纹理不再跨越整个立面; 有可见的接缝。

Frontfacade -->
   setupProjection(2, scope.xy, scope.sx, scope.sy, 1)  
  ...

Wall -->
  color(wallColor)
  setupProjection(0, scope.xy, 1.5, 1, 1) 
  set(material.colormap, wall_tex)
  set(material.dirtmap, dirt_tex)
  projectUV(0) projectUV(2)
与projectUV的立面
 
使用z- resp。W-坐标

 

沿着w轴的平面纹理投影有时会导致像这个门框上的伪像

纹理投影与工件

因此,setupProjection命令有一个可选参数uwFactor,它允许沿w方向投影纹理。uwFactor的值指定相对于u方向的tile宽度。此功能有时可用于“弯曲”角落周围的纹理,并避免过度使用组件分割。

删除了工件的纹理投影
 

全局纹理投影

此示例演示如何从区域图片快速创建纹理质量模型。

 

首先,使用图片创建属性图层。该属性层显示在左侧。以下是属性图层设置的详细信息。

带属性图层的图片

手动绘制许多初始形状(遵循建筑物的计数)。然后使用拉伸操作将初始形状挤出到基本质量模型。

attr buildingheight= 20
 
Lot-->
   set(trim.vertical, false)
   extrude(buildingheight)
挤出的初始形状

屋顶规则已添加。它将属性图层中显示的相同纹理投影到质量模型的顶面。选择全局x轴作为u轴,将全局z轴选择为v轴。这导致沿v轴的反转纹理,并通过scaleUV()操作进行校正。

attr buildingheight= 20
 
Lot-->
   set(trim.vertical, false)
   extrude(buildingheight)
   comp(f){top :  Roof | side : Facade}
 
Roof-->
   setupProjection(0, world.xz, 586, 442)
   projectUV(0)
   scaleUV(0, 1, -1)
   set(material.colormap, "test_0102_ortho.jpg")

根据坐标系,由于数值问题,纹理中可能存在伪影。通过使用setupProjection()操作的偏移参数可以避免这些。

attr buildingheight= 20
  
const textureWidth = 586
const textureHeight = 442  
  
offsetx = convert(x, scope, world, pos, 0, 0, 0) -
       	 (convert(x, scope, world, pos, 0, 0, 0) % textureWidth)

offsetz = convert(z, scope, world, pos, 0, 0, 0) -
       	 (convert(z, scope, world, pos, 0, 0, 0) % textureHeight)
   
Lot-->
   set(trim.vertical, false)
   extrude(buildingheight)
   comp(f){top :  Roof | side : Facade}
 
Roof-->
   setupProjection(0, world.xz, textureWidth, textureHeight, -offsetx, offsetz)
   projectUV(0)
   scaleUV(0, 1, -1)
   set(material.colormap, "test_0102_ortho.jpg")

Was this article helpful?

Related Articles

Leave A Comment?

You must be logged in to post a comment.