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 <raylib.h>
#include <raymath.h>
#include <stdio.h>
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;
}