raylib绘图库--瞿华
2022.7.1
知乎 1、raylib绘图库简介
知乎 2、raylib 2d动画/游戏教程(1)动画基本原理
知乎 3、raylib 2d动画/游戏教程(2)坐标系与颜色系统
知乎 4、raylib 2d动画/游戏教程(3)图像文件与图层
知乎 5、raylib 2d动画/游戏教程(4)raylib-drawing库
知乎 6、raylib 2d动画/游戏教程(5)键盘与鼠标输入
知乎 7、raylib 2d动画/游戏教程(6)游戏手柄输入
知乎 8、raylib 2d动画/游戏教程(7)音乐和音效
知乎 9、raylib绘制中文内容
知乎 10、使用raygui绘制控件
知乎 11、raylib 3d绘图基础教程(1)坐标系和摄像机
知乎 12、raylib 3d绘图基础教程(2)网格(Mesh)
知乎 13、raylib 3d绘图基础教程(3)几何变换
知乎 14、raylib 3d绘图基础教程(4)3d模型的载入与绘制
raylib 3d绘图基础教程(4)3d模型的载入与绘制
在实际的游戏编程中,让程序直接载入已有的3d模型会比较方便。本文介绍raylib的模型载入功能。
1 关于模型格式的讨论
在raylib中,可以直接导入obj、glTF、stl和fbx等格式的3d模型。
需要注意的是,raylib以及不同的建模软件对这几种格式支持的兼容程度不尽相同。笔者个人的经验是,raylib对blender导出的obj格式模型兼容性是最好的。如果某个模型不能被raylib正确载入,可以试下先导入blender,再用blender导出成obj格式模型,提供给raylib读取。
2 示例
假如我们已经有了一个blender导出的obj模式模型文件raylib_blender.obj,下面的程序(假设raylib_blender.obj和编译后的示例程序在同一文件夹里)会载入并显示这个模型:
#include
#include
#include
int main(void)
{
//初始化
const int screenWidth = 640;
const int screenHeight = 480;
//启用反锯齿
SetConfigFlags(FLAG_MSAA_4X_HINT);
//初始化窗口
InitWindow(screenWidth, screenHeight, "Sample");
//初始化摄像机
Camera3D camera = { 0 };
camera.position = (Vector3){ 10.0f, 10.0f, 10.0f };//相机所在位置{x,y,z}
camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };//相机朝向位置{x,y,z}
camera.up = (Vector3){ 0.0f, 0.0f, 1.0f };//相机正上方朝向矢量
camera.fovy = 40;//相机视野宽度
camera.projection = CAMERA_PERSPECTIVE;//采用透视投影
SetCameraMode(camera, CAMERA_FREE);//使用漫游摄像机
//创建几何体,滚动鼠标。程序少崩的模型https://github.com/tinyobjloader/tinyobjloader
Model model = LoadModel("raylib_blender.obj");//失败则正中显示小苯环。轮胎catmark_torus_creases0.obj
//设置动画帧率(刷新率,fps)为30帧/秒
SetTargetFPS(30);
//------
//主游戏循环
while (!WindowShouldClose())//关闭窗口或者按ESC键时返回true
{
UpdateCamera(&camera);
BeginDrawing();
ClearBackground(VIOLET);
//以摄像机视角绘制3d内容
BeginMode3D(camera);
DrawModel(model,(Vector3){0,0,0},1.0,WHITE);
EndMode3D();
EndDrawing();
}
//释放网格
UnloadModel(model);
//关闭窗口
CloseWindow();
return 0;
}
