Godot 3.1 говорит мне, что lock () и get_pixel () являются несуществующими функциями - PullRequest
3 голосов
/ 31 мая 2019

Я пытаюсь сгенерировать карту высот из текстуры шума.Насколько я понимаю, чтобы вызвать 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))

Любая помощь очень ценится.

РЕДАКТИРОВАТЬ - Я (пытался) осуществить изменения, которые были предложены в комментариях (но я до сих пор не 'Я не знаю, что делать с переменной цвета) и приложил снимок экрана моего результирующего кода, а также некоторые комментарии, которые я сделал, чтобы попытаться объяснить себе, почему процесс ДОЛЖЕН работать (я думаю).Он также показывает структуру моего узла, поэтому я решил отобразить это как изображение.Однако, когда я пытаюсь запустить это, программа вылетает с отображаемой ошибкой.

HeightMap Fail

1 Ответ

3 голосов
/ 01 июня 2019

Чек Документы ; 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 # имеет плохой сборщик мусора). Вам может понадобиться избавиться от изображения, инструмента поверхности и сетки (если вы удалите объект ландшафта), чтобы поддерживать оптимальную производительность.

...