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绘图库简介
https://zhuanlan.zhihu.com/p/458335134
raylib与小熊猫C++
为了让更多的学生体会编程的乐趣,小熊猫C++(原名小熊猫Dev-C++ 7)在发行版自带的编译器中集成了ege(2d动画游戏库)和libturtle(海龟作图库),可以编写简单的2d游戏程序,但它们仅能在windows下使用;在3d编程方面,小熊猫C++集成了freeglut和GLFW库,以便学生学习OpenGL,但这些3d库的使用比较繁琐,不太适合没有系统学习OpenGL的学生直接上手。

因此,从0.13.2版本开始,小熊猫C++在发行版自带的编译器中直接集成了跨平台的游戏库raylib 4.0,可用它编写各类2d和3d动画和游戏程序。

raylib简介
raylib是一个以简单易用为目标的跨平台游戏绘图库,它的特点包括:

免费开源(基于类似于BSD的zlib授权协议)
跨平台支持:Windows, Linux, MacOS, RPI, Android, HTML5等
全部用C语言实现
简单易用
使用OpenGL硬件加速(1.1, 2.1, 3.3, 4.3 or ES 2.0)
支持多种字体(XNA SpriteFonts, BMfonts, TTF, SDF)
支持多种材质格式,包括压缩材质(DXT, ETC, ASTC)
全面支持3D,包括Shapes,Models,Billboards, Heightmaps等
材质系统支持包括经典贴图和PBR贴图
支持动画3d模型(Animated 3d models)
支持多种着色器,包括模型着色器(Model shaders)和后处理着色器(Postprocessing shaders)
提供数学模块,支持矢量、矩阵和四元数(Quaternion)运算
支持多种音乐格式的载入和流媒体播放(WAV, OGG, MP3, FLAC, XM, MOD)
提供50多种编程语言的绑定
在raylib网站上提供了一些资源,包括:

raylib函数列表
raylib示例
raylib游戏示例
raylib与OpenGL
raylib缺省使用OpenGL 3.3。如果电脑上缺少OpenGL驱动,或者不支持OpenGL 3.3,则运行小熊猫C++自带的raylib时会报错:

GLFW error: 65543 Description : WGL:OpenGL profile requested but WGL_ARB_create_context_profile is unavailable.
对于显卡驱动最高只支持OpenGL2.1的用户,可以到百度网盘(提取码:b5vz)下载笔者编译的基于OpenGL 2.1的raylib,解压替换小熊猫C++自带的GCC编译器中的对应文件即可。

如果显卡不支持OpenGL 2.1,可以考虑使用软渲染的mesa驱动(把解压出来的opengl32.dll放在mingw32或者mingw64/bin文件夹里即可):Mesa3D For Windows。
问题:运行rayLib的hello.exe,报错GLFWError #65542 WGL: The driver does not appear to support OpenGL,无法正常启动。
处理:https://downloads.fdossena.com/Projects/Mesa3D/Builds/index.php下载MesaForWindows-17.0.0.zip。将opengl32.dll放在与要运行的exe同级的目录。支持XP2,但程序显示窗口就崩溃。

raylib示例
下面这个程序绘制了一个旋转的立方体(其实是摄像机在围绕立方体旋转):

#include <raylib.h>
#include <math.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){ 40.0f, 20.0f, 0.0f };//相机所在位置{x,y,z}
	camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };//相机朝向位置{x,y,z}
	camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };//相机正上方朝向矢量
	camera.fovy = 70.0f;//相机视野宽度
	camera.projection = CAMERA_PERSPECTIVE;//采用透视投影
	//设置动画帧率(刷新率,fps)为30帧/秒
	SetTargetFPS(30);
	//-----
	int angle=0;//多边形旋转角度
	//主游戏循环
	while (!WindowShouldClose())//关闭窗口或者按ESC键时返回true
	{
		double time = GetTime(); 
		//每次循环更新一帧
		//摄像机围绕y轴转动
		double cameraTime = time*0.3;
		camera.position.x = (float)cos(cameraTime)*40.0f;
		camera.position.z = (float)sin(cameraTime)*40.0f;
		BeginDrawing();
			ClearBackground(WHITE);
			//以摄像机视角绘制3d内容
			BeginMode3D(camera);
				DrawCube((Vector3){0,0,0},10,10,10,VIOLET);
				DrawCubeWires((Vector3){0,0,0},10,10,10,BLACK);
			EndMode3D();
		EndDrawing();
	}
	//关闭窗口
	CloseWindow();
	return 0;
}



旋转的立方体
对于初学者来说,只要了解了OpenGL的3维坐标系,以及摄像机投影的各项基本参数,很快就可以用raylib编写3d动画程序啦。