スポンサーリンク

Rust+cgmathで変換行列を計算

glTranslated等のレガシーな関数が非推奨になっているので移動行列や回転行列や射影行列を自分で計算しないといけない。面倒なのでクレートを使う。いくつかあるが、cgmathがglmに近い使い勝手らしい。

Cargo.toml

以下のようにCargo.tomlにcgmathを追加する。

[package]
name = "opengltest"
version = "0.1.0"
edition = "2021"


[dependencies]
glutin = "0.26.0"
gl="0.14.0"

cgmath = "0.18.0"

使用例

以下、translate,rotate,perspective view matrixの使用例。

pub fn draw_triangle(programid:gl::types::GLuint,vertexbuffer: gl::types::GLuint,colorbuffer:gl::types::GLuint){

    unsafe {
        gl::UseProgram(programid);
    }


    let translate_mat = cgmath::Matrix4::from_translation(
        cgmath::Vector3::new(0.0,0.0,-3.0)
    );
    let rotate_mat = cgmath::Matrix4::from_angle_z(cgmath::Deg(45.0));

    let model_mat = rotate_mat * translate_mat;

    let fov = cgmath::Deg(45.0);
    let aspect = 1.0;
    let near = 0.1;
    let far = 100.0;
    let proj_mat = cgmath::perspective(fov,aspect,near,far);


    let proj;
    let model;
    unsafe {
        let proj_location_name = CString::new("projectionMatrix").unwrap();
        let model_location_name = CString::new("modelViewMatrix").unwrap();
        proj = gl::GetUniformLocation(programid,proj_location_name.as_ptr());
        model = gl::GetUniformLocation(programid,model_location_name.as_ptr());

        gl::UniformMatrix4fv(proj,1,gl::FALSE,proj_mat.as_ptr());
        gl::UniformMatrix4fv(model,1,gl::FALSE,model_mat.as_ptr());
    }
/*
    // デバッグ
    println!("proj location: {}",proj);
    println!("model location: {}",model);
*/

    unsafe{
        gl::EnableVertexAttribArray(0);
        gl::BindBuffer(gl::ARRAY_BUFFER,vertexbuffer);
        gl::VertexAttribPointer(
            0,
            3,
            gl::FLOAT,
            gl::FALSE,
            0,
            null()
        );
    }

    unsafe{
        gl::EnableVertexAttribArray(1);
        gl::BindBuffer(gl::ARRAY_BUFFER,colorbuffer);
        gl::VertexAttribPointer(
            1,
            3,
            gl::FLOAT,
            gl::FALSE,
            0,
            null()
        );
    }

    unsafe {
        gl::DrawArrays(gl::TRIANGLES, 0,3);

        let err_check = gl::GetError();
        if err_check != gl::NO_ERROR {
            println!("ERROR::: {}\n", err_check);
        }

        gl::DisableVertexAttribArray(0);
        gl::DisableVertexAttribArray(1);
    }

    unsafe {
        gl::UseProgram(0);
    }

}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: