簡體   English   中英

在給定的世界坐標處修改網格上的紋理

[英]Modifying a texture on a mesh at given world coordinate

我正在制作一個編輯器,我想在其中構建地形圖。 我想用鼠標來增加/減少地形高度來創造山脈和湖泊。

從技術上講,我有一個高度圖,我想在我用鼠標選擇的某個texcoord上進行修改。 要做到這一點,我首先從屏幕坐標到世界位置 - 我已經做到了。 下一步,從世界位置到選擇正確的紋理坐標讓我感到困惑。 我怎么做?

如果您使用的是簡單的hightmap,那么您將其用作位移貼圖,即y方向。 基礎網格位於xz平面(y = 0)。

您可以從已計算的世界坐標中丟棄y坐標,並獲得基礎網格上的點。 從那里你可以將它映射到紋理空間,你可以映射你的紋理。

我不會那樣實現它。 我會將場景渲染到幀緩沖區,而不是渲染紋理網格,將紋理坐標顏色編碼到網格上。 如果我點擊屏幕空間中的某個地方,我可以簡單地從幀緩沖區讀取像素值並直接獲取紋理坐標。 無論如何,對幀緩沖區的渲染應該非常便宜。

假設您的地形是一個簡單的矩形,您首先要計算鼠標世界位置和地形原點之間的向量。 (地形四邊形的頂點,高度貼圖的左上角將映射到該頂點)。 例如mouse (50,25) - origin(-100,-100) = (150,125)
現在將x和y坐標除以地形四邊形的世界空間寬度和高度。
150 / 200 = 0.75125 / 200 = 0.625 這為您提供紋理坐標,如果您需要它們作為像素坐標而不是簡單地乘以紋理的大小。

我假設如下:

  1. 您計算的世界坐標是視圖frustrum中鼠標指針的坐標。 我把它們命名為mouseCoord
  2. 我們還有攝像機坐標,camCoord
  3. 世界由三角形組成
  4. 每個三角形點都有紋理坐標,這些坐標由重心坐標插值

如果是這樣,解決方案是這樣的:

  1. 使用camCoord作為原點。 計算光線的方向為mouseCoord - camCoord。
  2. 計算與三角形的交點。 天真的變體是檢查每個三角形是否相交,更復雜的是先用其他算法排除幾個三角形,比如在立方體中划分世界,沿立方體追蹤光線,只看有重疊的三角形與立方體。 可以像在這個網站上一樣計算三角形的交點: http//www.lighthouse3d.com/tutorials/maths/ray-triangle-intersection/
  3. 計算相對於該三角形的交點重心坐標,如: https//www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/barycentric-coordinates
  4. 使用重心坐標作為相應三角形點的紋理坐標的權重。 結果是交叉點的紋理坐標,也就是你想要的。

如果我誤解了您的想法,請使用其他信息編輯您的問題。

另一種特定於高度圖的變體:

假設假設改變如下:

  1. 世界上有x和y的地磚
  2. 地磚在其角落處具有高度值
  3. 對於圖塊內的點,高度值以某種方式進行插值,例如通過雙線性插值。
  4. 紋理以相同的方式進行插值,同樣使用角的給定紋理坐標

一種可行的算法(近似):

  1. 再次,計算原點和方向。
  2. Wlog,我們假設方向在x方向上有更高的變化。 如果不是,則在算法中交換x和y。
  3. 以x的給定步長跟蹤光線,也就是說,在每個步驟中,x坐標按該步長變化。 (取方向,將其乘以步長除以它的x值,將新方向添加到從原點開始的當前位置)
  4. 對於當前坐標,檢查它的z值是否低於當前高度(也就是剛剛與地面碰撞)
  5. 如果是這樣,要么完成或減小步長並在附近進行更精細的搜索,然后向后移動,直到再次高於高度,然后再往前走更精細的步驟等等。 結果是當前的x和y坐標
  6. 計算當前切片中x和y坐標的相對位置。 將其用於角落紋理坐標的權重。

理論上,該算法可以跳過非常薄的頂部。 選擇足夠小的步長來對付它。 在不知道高度圖使用什么類型的插值的情況下,我無法給出精確的算法。 無論如何,創建三角形可能不是最糟糕的想法,可能是雙線性插值坐標? 在任何情況下,該算法都很好地找到它碰撞的區塊。

另一種變體是在xy坐標穿過瓷磚網格的點上跟蹤光線,然后查看z坐標是否低於高度圖。 然后我們就知道它在這個瓷磚中碰撞了。 如果高度可以在區塊內部比在其邊緣處更大,則可能產生假陰性,因為某些形式的插值可以產生,尤其是那些考慮相鄰區塊的插值。 但是,使用雙線性插值可以正常工作。

在雙線性插值中,可以找到精確的交點:采用光線穿過網格的兩個(x,y)坐標。 計算檢索兩個(x,y,z)坐標的高度。 用它們創建一條線。 計算該線與光線的交點。 那些交叉點是與瓦片高度圖的交點。

最簡單的方法是將網格渲染為uvs作為顏色的預傳。 沒有屏幕需要世界。 uv是鼠標位置的值。 使用mips /過濾etv時要小心

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM