[英]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.75
和125 / 200 = 0.625
。 這為您提供紋理坐標,如果您需要它們作為像素坐標而不是簡單地乘以紋理的大小。
我假設如下:
如果是這樣,解決方案是這樣的:
如果我誤解了您的想法,請使用其他信息編輯您的問題。
另一種特定於高度圖的變體:
假設假設改變如下:
一種可行的算法(近似):
理論上,該算法可以跳過非常薄的頂部。 選擇足夠小的步長來對付它。 在不知道高度圖使用什么類型的插值的情況下,我無法給出精確的算法。 無論如何,創建三角形可能不是最糟糕的想法,可能是雙線性插值坐標? 在任何情況下,該算法都很好地找到它碰撞的區塊。
另一種變體是在xy坐標穿過瓷磚網格的點上跟蹤光線,然后查看z坐標是否低於高度圖。 然后我們就知道它在這個瓷磚中碰撞了。 如果高度可以在區塊內部比在其邊緣處更大,則可能產生假陰性,因為某些形式的插值可以產生,尤其是那些考慮相鄰區塊的插值。 但是,使用雙線性插值可以正常工作。
在雙線性插值中,可以找到精確的交點:采用光線穿過網格的兩個(x,y)坐標。 計算檢索兩個(x,y,z)坐標的高度。 用它們創建一條線。 計算該線與光線的交點。 那些交叉點是與瓦片高度圖的交點。
最簡單的方法是將網格渲染為uvs作為顏色的預傳。 沒有屏幕需要世界。 uv是鼠標位置的值。 使用mips /過濾etv時要小心
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.