我正在尝试从噪声纹理生成高度图。据我了解,在这种情况下,要在图像上调用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))
非常感谢您的帮助。
答案 0 :(得分:0)
检查the docs;
StreamTexture
没有方法lock
。
我认为您要使用的课程是Image
。 Texture
类通常用于在屏幕上绘制或应用于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