Loops 戈多重复中断脚本

Loops 戈多重复中断脚本,loops,godot,gdscript,Loops,Godot,Gdscript,我正在戈多做一个模式7/透视投影项目。当我运行它时,它会产生预期的效果,显示一个2d图像,就像它是一个3d平面一样。 代码: 图片: 然而,我有一个问题。我在ready函数中有代码,在for循环中。我希望每帧调用一次,但当我将重复次数从一次增加到两次时,整个图像将变为红色。我不知道是什么原因造成的。一种猜测是我没有正确地锁定和解锁图像,但很可能不是这样。另一个猜测是,x和y变量并不是每次都重置,但也可以正常工作。我不认为循环本身就是问题所在,但我不知道出了什么问题。我努力让您的代码运行。我中途

我正在戈多做一个模式7/透视投影项目。当我运行它时,它会产生预期的效果,显示一个2d图像,就像它是一个3d平面一样。 代码:

图片:


然而,我有一个问题。我在ready函数中有代码,在for循环中。我希望每帧调用一次,但当我将重复次数从一次增加到两次时,整个图像将变为红色。我不知道是什么原因造成的。一种猜测是我没有正确地锁定和解锁图像,但很可能不是这样。另一个猜测是,x和y变量并不是每次都重置,但也可以正常工作。我不认为循环本身就是问题所在,但我不知道出了什么问题。

我努力让您的代码运行。我中途放弃了,用锁位实现了逻辑。代码如下:

extends Sprite

export(Transform) var matrix:Transform
var sampler:Image
var buffer:Image
var size:Vector2
var center:Vector2

func _ready():
    sampler = texture.get_data()
    var err = sampler.decompress()
    if err != OK:
        push_error("Failed to decompress texture")
        return

    size = Vector2(texture.get_width(), texture.get_height())
    center = size * 0.5

    buffer = Image.new()
    buffer.create(int(size.x), int(size.y), false, Image.FORMAT_RGBA8)

func _process(_delta):
    #matrix = matrix.rotated(Vector3.RIGHT, 0.01)
    
    sampler.lock()
    buffer.lock()
    for y in size.x:
        for x in size.y:
            var uv:Vector3 = matrix * Vector3(x - center.x, y - center.y, 1.0)
            
            if uv.z <= 0.0:
                buffer.set_pixel(x, y, Color.transparent)
                continue
            
            var _x = (uv.x / uv.z) + center.x
            var _y = (uv.y / uv.z) + center.y
            if _x < 0.0 or _x >= size.x or _y < 0.0 or _y >= size.y:
                buffer.set_pixel(x, y, Color.transparent)
                continue

            #buffer.set_pixel(x, y, Color(_x / size.x, y / size.y, 0.0))
            buffer.set_pixel(x, y, sampler.get_pixel(_x, _y))
    buffer.unlock()
    sampler.unlock()

    var display = ImageTexture.new()
    display.create_from_image(buffer, 0)
    self.texture = display
相当于(除非我没有将坐标缩放到0到1的范围):

然后我有一句话:

if (uv.z < 0.0) discard;
COLOR = texture(TEXTURE, (uv.xy / uv.z) + 0.5);
结果是这样的:

if uv.z <= 0.0:
    buffer.set_pixel(x, y, Color.transparent)
    continue
var _x = (uv.x / uv.z) + center.x
var _y = (uv.y / uv.z) + center.y
if _x < 0.0 or _x >= size.x or _y < 0.0 or _y >= size.y:
    buffer.set_pixel(x, y, Color.transparent)
    continue

buffer.set_pixel(x, y, sampler.get_pixel(_x, _y))
func mult(matrix, vector:Vector2) -> Vector2:
    var x = vector.x * matrix.a + vector.y * matrix.b
    var y = vector.x * matrix.c + vector.y * matrix.d
    return Vector2(x, y)
func mult(a:float, b:float, c:float, d:float, vector:Vector2) -> Vector2:
    var x = vector.x * a + vector.y * b
    var y = vector.x * c + vector.y * d
    return Vector2(x, y)
即:

var rp = mult(M, r - r_0) + r_0
其中
mult
如下所示:

if uv.z <= 0.0:
    buffer.set_pixel(x, y, Color.transparent)
    continue
var _x = (uv.x / uv.z) + center.x
var _y = (uv.y / uv.z) + center.y
if _x < 0.0 or _x >= size.x or _y < 0.0 or _y >= size.y:
    buffer.set_pixel(x, y, Color.transparent)
    continue

buffer.set_pixel(x, y, sampler.get_pixel(_x, _y))
func mult(matrix, vector:Vector2) -> Vector2:
    var x = vector.x * matrix.a + vector.y * matrix.b
    var y = vector.x * matrix.c + vector.y * matrix.d
    return Vector2(x, y)
func mult(a:float, b:float, c:float, d:float, vector:Vector2) -> Vector2:
    var x = vector.x * a + vector.y * b
    var y = vector.x * c + vector.y * d
    return Vector2(x, y)
但是,正如我所说,没有方便的矩阵类型。如果我们出口
a
b
c
d
,我们有:

var rp = mult(a, b, c, d, r - r_0) + r_0
mult
看起来是这样的:

if uv.z <= 0.0:
    buffer.set_pixel(x, y, Color.transparent)
    continue
var _x = (uv.x / uv.z) + center.x
var _y = (uv.y / uv.z) + center.y
if _x < 0.0 or _x >= size.x or _y < 0.0 or _y >= size.y:
    buffer.set_pixel(x, y, Color.transparent)
    continue

buffer.set_pixel(x, y, sampler.get_pixel(_x, _y))
func mult(matrix, vector:Vector2) -> Vector2:
    var x = vector.x * matrix.a + vector.y * matrix.b
    var y = vector.x * matrix.c + vector.y * matrix.d
    return Vector2(x, y)
func mult(a:float, b:float, c:float, d:float, vector:Vector2) -> Vector2:
    var x = vector.x * a + vector.y * b
    var y = vector.x * c + vector.y * d
    return Vector2(x, y)

我们可以很容易地使用修改代码来做到这一点。首先导出
a
b
c
d
,如我所说:

export(float) var a:float
export(float) var b:float
export(float) var c:float
export(float) var d:float
这是
\u过程
修改:

func _process(_delta):
    sampler.lock()
    buffer.lock()
    for y in size.x:
        for x in size.y:
            var rp = mult(a, b, c, d, Vector2(x, y) - center) + center
            if rp.x < 0.0 or rp.x >= size.x or rp.y < 0.0 or rp.y >= size.y:
                buffer.set_pixel(x, y, Color.transparent)
                continue

            buffer.set_pixel(x, y, sampler.get_pixel(rp.x, rp.y))
    buffer.unlock()
    sampler.unlock()

    var display = ImageTexture.new()
    display.create_from_image(buffer, 6)
    self.texture = display
func\u进程(\u delta):
sampler.lock()
buffer.lock()
对于尺寸为y.x的尺寸:
尺寸为x.y时:
var rp=多(a,b,c,d,向量2(x,y)-中心)+中心
如果rp.x<0.0或rp.x>=尺寸.x或rp.y<0.0或rp.y>=尺寸.y:
缓冲区。设置像素(x,y,颜色。透明)
持续
缓冲区。设置像素(x,y,采样器。获取像素(rp.x,rp.y))
buffer.unlock()
sampler.unlock()
var display=ImageTexture.new()
显示。从图像创建图像(缓冲区,6)
self.texture=显示
当然,
mult
就是我上面展示的那个。我在这里假设
ru0
就是我所说的
center

我不知道如何解释
a
b
c
d
,所以这里是
a=1
b=2
c=3
d=4