ホームページ  >  記事  >  バックエンド開発  >  ゴーランキューブの作り方

ゴーランキューブの作り方

王林
王林オリジナル
2023-05-14 18:01:38461ブラウズ

クラウド コンピューティング、ビッグ データ、人工知能などのテクノロジーの急速な発展に伴い、プログラミング言語の需要もますます高まっています。中でもGolangは、Googleが開発した新しいプログラミング言語として、その効率性、シンプルさ、セキュリティなどの特徴から注目を集めています。キューブの処理も、Golang 開発における重要な問題の 1 つになっています。この記事では、Golang の開発技術をより深く理解するために、Golang キューブの処理方法を紹介します。

1. 立方体の概要

3 次元空間では、立方体は六面体であり、各面は正方形です。標準的な立方体には 8 つの頂点と 12 の辺があります。立方体の体積の公式は V=a3 です。ここで、a は立方体の辺の長さを表します。

コンピュータ グラフィックス処理において、立方体は頻繁に使用されるオブジェクトです。立方体は 3D モデルの基本形状を表すことができ、レンダリング プロセスの基本単位としても使用できます。

2. Golang のキューブ処理方法

1. キューブの作成

Golang でキューブを作成するには、メッシュ、ジオメトリ、マテリアルの 3 つのキーワードが必要です。このうち、メッシュはオブジェクトのメッシュモデルを表し、ジオメトリはオブジェクトの形状を表し、マテリアルはオブジェクトの材質(テクスチャ、色など)を表します。

キューブを作成するサンプル コードは次のとおりです。

package main

import (

"github.com/go-gl/gl/v4.1-core/gl"
"github.com/go-gl/mathgl/mgl32"

)

type Cube struct {

vao             uint32
vbo             uint32
vertexPositions []float32
shaderProgram   uint32

}

func (c *Cube) Init(shaderProgram uint32) {

c.vertexPositions = []float32{
    // Front
    -1.0, -1.0, 1.0,
    1.0, -1.0, 1.0,
    1.0, 1.0, 1.0,
    -1.0, 1.0, 1.0,
    // Back
    -1.0, -1.0, -1.0,
    1.0, -1.0, -1.0,
    1.0, 1.0, -1.0,
    -1.0, 1.0, -1.0,
}

indices := []uint32{
    // Front
    0, 1, 2,
    2, 3, 0,
    // Back
    4, 5, 6,
    6, 7, 4,
    // Top
    3, 2, 6,
    6, 7, 3,
    // Bottom
    0, 1, 5,
    5, 4, 0,
    // Left
    0, 3, 7,
    7, 4, 0,
    // Right
    1, 2, 6,
    6, 5, 1,
}

c.shaderProgram = shaderProgram
gl.GenVertexArrays(1, &c.vao)
gl.BindVertexArray(c.vao)

gl.GenBuffers(1, &c.vbo)
gl.BindBuffer(gl.ARRAY_BUFFER, c.vbo)
gl.BufferData(gl.ARRAY_BUFFER, len(c.vertexPositions)*3*4, gl.Ptr(c.vertexPositions), gl.STATIC_DRAW)

gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 3*4, gl.PtrOffset(0))
gl.EnableVertexAttribArray(0)

gl.GenBuffers(1, &ibo)
gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo)
gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, len(indices)*3*4, gl.Ptr(indices), gl.STATIC_DRAW)

}

func (c *Cube) Draw() {

gl.UseProgram(c.shaderProgram)
gl.BindVertexArray(c.vao)
gl.DrawElements(gl.TRIANGLES, 6*2*3, gl.UNSIGNED_INT, gl.PtrOffset(0))

}

func (c *Cube) Destroy() {

gl.DeleteVertexArrays(1, &c.vao)
gl.DeleteBuffers(1, &c.vbo)
gl.DeleteProgram(c.shaderProgram)

}

2. キューブの回転

Golang の場合, 数学ライブラリ glmath の Rotate3D メソッドを使用すると、立方体を 3 次元で回転できます。単純なキューブ回転のサンプル コードを次に示します。

package main

import (

"github.com/go-gl/gl/v4.1-core/gl"
"github.com/go-gl/mathgl/mgl32"

)

func main() {

if err := gl.Init(); err != nil {
    panic(err)
}
defer gl.Terminate()

window := createWindow()

shaderProgram := createShaderProgram()

cube := &Cube{}
cube.Init(shaderProgram)

for !window.ShouldClose() {
    gl.ClearColor(0.2, 0.2, 0.3, 1.0)
    gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)

    // 计算旋转矩阵
    angle := float32(glfw.GetTime()) * mgl32.DegToRad(45.0)
    axis := mgl32.Vec3{0, 1, 0}
    model := mgl32.Ident4()
    model = model.Mul4(mgl32.Translate3D(0, 0, -4)) // 平移
    model = model.Mul4(mgl32.HomogRotate3D(angle, axis)) // 旋转

    // 更新uniform值
    gl.UseProgram(shaderProgram)
    gl.UniformMatrix4fv(gl.GetUniformLocation(shaderProgram, gl.Str("model")), 1, false, &model[0])

    cube.Draw()

    window.SwapBuffers()
    glfw.PollEvents()
}

cube.Destroy()

}

3. キューブ テクスチャ マッピング

Golang では、OpenGL メソッドを使用してテクスチャ マッピング操作を実行できます。まず、テクスチャ ファイルをロードし、立方体の表面でマッピング操作を実行する必要があります。

これは、単純なキューブ テクスチャ マッピングのサンプル コードです:

package main

import (

"github.com/go-gl/gl/v4.1-core/gl"
"github.com/go-gl/glfw/v3.2/glfw"
"github.com/go-gl/mathgl/mgl32"
"image"
"image/draw"
_ "image/jpeg"
_ "image/png"
"os"

)

func LoadTextureFromFile (ファイルパス文字列) (テクスチャ uint32、エラー エラー) {

// 加载纹理文件
file, err := os.Open(filepath)
if err != nil {
    return 0, err
}
defer file.Close()

img, _, err := image.Decode(file)
if err != nil {
    return 0, err
}

// 创建空白纹理
rgba := image.NewRGBA(img.Bounds())
if rgba.Stride != rgba.Rect.Size().X*4 {
    panic("unsupported stride")
}
draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src)

// 创建纹理
gl.GenTextures(1, &texture)
gl.BindTexture(gl.TEXTURE_2D, texture)

gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT)

gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, int32(rgba.Rect.Size().X), int32(rgba.Rect.Size().Y), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(rgba.Pix))

return texture, nil

}

func main() {

if err := gl.Init(); err != nil {
    panic(err)
}
defer gl.Terminate()

window := createWindow()

shaderProgram := createShaderProgram()

cube := &Cube{}
cube.Init(shaderProgram)

// 加载纹理
texture, err := LoadTextureFromFile("texture.jpg")
if err == nil {
    gl.BindTexture(gl.TEXTURE_2D, texture)
}

for !window.ShouldClose() {
    gl.ClearColor(0.2, 0.2, 0.3, 1.0)
    gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)

    // 计算旋转矩阵
    angle := float32(glfw.GetTime()) * mgl32.DegToRad(45.0)
    axis := mgl32.Vec3{0, 1, 0}
    model := mgl32.Ident4()
    model = model.Mul4(mgl32.Translate3D(0, 0, -4)) // 平移
    model = model.Mul4(mgl32.HomogRotate3D(angle, axis)) // 旋转

    // 更新uniform值
    gl.UseProgram(shaderProgram)
    gl.UniformMatrix4fv(gl.GetUniformLocation(shaderProgram, gl.Str("model")), 1, false, &model[0])

    cube.Draw()

    window.SwapBuffers()
    glfw.PollEvents()
}

cube.Destroy()

}

3. 概要

Golang は、新しいプログラミング言語として、その効率性、シンプルさ、セキュリティおよびその他の特性により広く注目を集めています。キューブの処理に関しては、Golang はキューブの作成、キューブの回転、キューブのテクスチャ マッピングなどの豊富な処理方法を提供します。上記のサンプル コードを通じて、読者は Golang の開発テクノロジと 3 次処理原理をさらに理解し、Golang を開発作業にさらに適切に適用することができます。

以上がゴーランキューブの作り方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。