2021SC@SDUSC Ebiten(二) 几何矩阵代码详解

2021SC@SDUSC

Go语言的简单2D游戏库-Ebiten   

 

代码

package main

import (
	_ "image/png"
	"log"

	"github.com/hajimehoshi/ebiten/v2"
	"github.com/hajimehoshi/ebiten/v2/ebitenutil"
)

var img *ebiten.Image

func init() {
	var err error
	img, _, err = ebitenutil.NewImageFromFile("gopher.png")
	if err != nil {
		log.Fatal(err)
	}
}

type Game struct{}

func (g *Game) Update() error {
	return nil
}

func (g *Game) Draw(screen *ebiten.Image) {
	op := &ebiten.DrawImageOptions{}
	op.GeoM.Translate(50, 50)
	op.GeoM.Scale(1.5, 1)
	screen.DrawImage(img, op)
}

func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
	return 640, 480
}

func main() {
	ebiten.SetWindowSize(640, 480)
	ebiten.SetWindowTitle("Geometry Matrix")
	if err := ebiten.RunGame(&Game{}); err != nil {
		log.Fatal(err)
	}
}

要执行此程序,您需要gopher.png同一目录下的图像文件:

2021SC@SDUSC Ebiten(二) 几何矩阵代码详解_第1张图片

结果将是这样的:

2021SC@SDUSC Ebiten(二) 几何矩阵代码详解_第2张图片

代码如何工作

	op := &ebiten.DrawImageOptions{}
	op.GeoM.Translate(50, 50)
	op.GeoM.Scale(1.5, 1)
	screen.DrawImage(img, op)

1、

该程序几乎与渲染图像程序差不多。区别在于调用时DrawImageOptions是否指定DrawImage。在本例中,调整了 Geom 。Geom表示用于平移、缩放或旋转图像的仿射矩阵。

在这个例子中,图像首先被表示成 (50, 50),然后按比例缩放 (1.5, 1). 在 Ebiten 中,Y 轴不是向上而是向下。然后,图片表示为(50, 50)意思是图像向右移动 50 像素,向下移动 50 像素。对于缩放,原点在左上角,方向也是向下和向右。

2、

​  

Geom是一个二维维矩阵,Geom的维数是 3,因为Geom是一个仿射矩阵,不仅可以表示缩放或旋转,还可以表示平移。虽然缩放和旋转不会改变原点(左上),但平移会改变,并且这种改变不能通过非仿射二维矩阵实现。最后一行总是(0, 0, 1).

 几何矩阵用于确定如何将源图像中的位置转换为目标图像中的位置。换言之,几何矩阵代表了位置的转换规则。通过调整几何矩阵,我们可以调整如何在目标图像上渲染源图像。

3、

Geom的初始值代表一个单位矩阵。这意味着什么都没有改变。在 Ebiten 中,默认位置是左上角。

注意Y轴的方向是向下,不是向上。这与通常的数学不同,但对于 2D 图像渲染来说是很自然的。

2021SC@SDUSC Ebiten(二) 几何矩阵代码详解_第3张图片

4、

(g *GeoM).Scale左乘缩放几何矩阵。原点位置是目标图像的左上角。

如果被乘数是恒等式,则图像由Scale参数缩放而不改变左上角的位置。

2021SC@SDUSC Ebiten(二) 几何矩阵代码详解_第4张图片

5、

(g *GeoM).Translate 左乘平移几何矩阵。

如果被乘数是恒等式,则图像从左上角通过Translate参数移动。

2021SC@SDUSC Ebiten(二) 几何矩阵代码详解_第5张图片

6、

(g *GeoM).Rotate左乘旋转几何矩阵。原点位置是目标图像的左上角。

如果被乘数是恒等式,则图像由Rotate参数旋转。旋转的中心是左上角。

2021SC@SDUSC Ebiten(二) 几何矩阵代码详解_第6张图片

7、

当然,可以组合几何矩阵的多个操作。它们表示为矩阵的乘法。请注意,乘法的顺序很重要。例如,平移然后缩放图像的结果通常不同于缩放然后平移图像。在 Ebiten 中,操作通过左乘连接,然后实际操作顺序在数学表达式中是从右到左。

2021SC@SDUSC Ebiten(二) 几何矩阵代码详解_第7张图片

2021SC@SDUSC Ebiten(二) 几何矩阵代码详解_第8张图片

你可能感兴趣的:(Ebiten,go,go语言)