Godot 3.1告诉我lock()和get_pixel()是不存在的函数

时间:2019-05-31 04:47:38

标签: godot gdscript

我正在尝试从噪声纹理生成高度图。据我了解,在这种情况下,要在图像上调用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))

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

检查the docsStreamTexture没有方法lock

我认为您要使用的课程是ImageTexture类通常用于在屏幕上绘制应用于Material

var noiseImage = Image.new()
noiseImage.load("res://noiseTexture.png")
noiseImage.lock() # Lock the image here
var color = noiseImage.get_pixel(10, 10) # Replace with your height map population

PS:

仅告诉您,这里的内存使用存在很多问题,因此请确保您也对此进行了测试(尽管C#具有不良的垃圾收集器)。 您可能需要处理图像,曲面工具和阵列网格(如果删除了地形对象),以保持最佳性能。

答案 1 :(得分:0)

在生成高度图地形时遇到了类似的问题。

nathanfranke是正确的,他的解决方案将起作用。

如果由于某种原因使用了ImageTexture,则可以调用get_data()来获取基础图像。然后,就像内森在他的回答中说的那样,在lock()上呼叫Image

请注意检查get_pixel()的坐标是否正确。您可以通过单击代码行的最左边来设置断点。 我之所以这样说是因为我很沮丧,直到我意识到我的坐标计算都为整数,导致采样像素始终为<0,0>。

这是我的代码的一部分,用于将图像采样到HeightMapShape.map_data中以防子弹高度图碰撞:

var map_w = shape.map_width
var map_h = shape.map_depth
var img_w = img.get_width()
var img_h = img.get_height()
img.lock()

for y in range(0, map_h):
    py = float(img_h) * (float(y) / float(map_h))

    for x in range(0, map_w):
        px = float(img_w) * (float(x) / float(map_w))
        index = y * img_h + x
        pix = img.get_pixel(px, py)
        shp.map_data[index] = pix.r * heightmap_height + heightmap_offset