我正在尝试从噪声纹理生成高度图。据我了解,为了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))
任何帮助是极大的赞赏。
编辑 - 我已经(尝试)实施评论中建议的更改(但我仍然不知道如何处理颜色变量)并附上了我生成的代码的屏幕截图以及我的一些评论试图向自己解释为什么这个过程应该有效(我认为)。它还显示了我的节点结构,这就是我选择将其显示为图像的原因。但是,当我尝试运行它时,程序崩溃并显示错误。