3

ノイズ テクスチャから高さマップを生成しようとしています。私の知る限りget_pixel()、このコンテキストで画像を呼び出すには、まず画像をロックする必要があります。ただし、プログラムを実行しようとすると、エラーで終了します: Invalid call. Nonexistent function 'lock' in base 'StreamTexture'.

イメージをロックせずに実行しようとすると、次のエラーが表示されますInvalid call. Nonexistent function 'get_pixel' in base 'StreamTexture'

私が実行している指示は、私が実行している Godot の同じバージョン (3.1) に対するものであると確信していlock()ますget_pixel()

私のコードはここにあります:

extends Spatial

var width
var height
var heightData = {}
var vertices = PoolVector3Array()
var drawMesh = Mesh.new()

func _ready():
    var noiseTexture = load("res://noiseTexture.png")
    width = noiseTexture.get_width()
    height = noiseTexture.get_height()

    noiseTexture.lock()
    for x in range(0, width):
        for y in range(0, height):
            heightData[Vector2(x,y)] = noiseTexture.get_pixel(x,y).r
    noiseTexture.unlock()

    for x in range(0, width-1):
        for y in range(0, height-1):
            createQuad(x,y)

    var surfTool = SurfaceTool.new()
    surfTool.begin(Mesh.PRIMITIVE_TRIANGLES)

    for i in vertices.size():
        surfTool.add_vertex(vertices[i])

    surfTool.commit(drawMesh)
    $MeshInstance.mesh = drawMesh

func createQuad(x,y):
    #First half
    vertices.push_back(Vector3(x, heightData[Vector2(x,y)], -y))
    vertices.push_back(Vector3(x, heightData[Vector2(x,y+1)], -y-1))
    vertices.push_back(Vector3(x+1, heightData[Vector2(x+1,y+1)], -y-1))
    #Second Half
    vertices.push_back(Vector3(x, heightData[Vector2(x,y)], -y))
    vertices.push_back(Vector3(x+1, heightData[Vector2(x+1,y+1)], -y-1))
    vertices.push_back(Vector3(x+1, heightData[Vector2(x+1,y)], -y))

どんな助けでも大歓迎です。

編集 - コメントで提案された変更を実装しようとしました (まだ色変数をどうするかわかりません)。結果のコードのスクリーンショットといくつかのコメントを添付しました。プロセスが機能する必要がある理由を自分自身に説明しようとしました(私は思います)。また、ノード構造も表示されるため、これを画像として表示することにしました。ただし、これを実行しようとすると、エラーが表示されてプログラムがクラッシュします。

高さマップの失敗

4

2 に答える 2