raylib一些示例代码

2023-05-16

摘要:[几种相机视角] 3D预览图视角:鼠标拖动,滚轮缩放。只能沿着中心点。第一视角:WSAD分别控制视角的前后左右移动,EQ分别控制上下移动,滚轮控制移动速度。[画正方体线框]

文章目录

  • 几种相机视角
    • 头文件
    • 3D预览图视角
    • 第一视角
  • 画正方体线框
  • 球面上均匀取点

几种相机视角

  相机视角放在项目代码里而不是raylib的库代码里,因为每个项目对相机视角的要求都太不一样。常用的几种视角的代码在下面给出。

头文件

几种相机视角共用一个头文件。

#ifndef UTILS_H
#define UTILS_H
#include "raylib.h"

#if defined(__cplusplus)
extern "C" {
#endif

void Init_Camera(Camera *camera);
void Update_Camera(Camera *camera);

#if defined(__cplusplus)
}
#endif

#endif // UTILS_H

3D预览图视角

鼠标拖动,滚轮缩放。只能沿着中心点。

/*3D预览图视角*/
#include <math.h>
#include "camera.h"

#define SENSITIVITY                      0.01f
#define CameraMoveExponential            0.9f
#define VAL_LIMIT(x, min, max)           (((x)<=(min) ? (min) : ((x)>=(max) ? (max) : (x))))

float yaw, pit, dist;

void Init_Camera(Camera *camera)
{
    Vector2 vec;
    camera->position = (Vector3){ 0.0f, -20.0f, 20.0f };
    camera->target = (Vector3){ 0.0f, 0.0f, 0.0f };
    camera->up = (Vector3){ 0.0f, 0.0f, 1.0f };
    camera->fovy = 45.0f;
    vec.x = camera->target.x - camera->position.x;
    vec.y = camera->target.y - camera->position.y;
    yaw = atan2f(vec.y, vec.x);
    vec.x = sqrtf(vec.x*vec.x + vec.y*vec.y);
    vec.y = camera->target.z - camera->position.z;
    pit = atan2f(vec.y, vec.x);
    dist = sqrtf(vec.x*vec.x + vec.y*vec.y);
}

void Update_Camera(Camera *camera)
{
    static Vector2 mousePosPre;
    Vector2 mousePosNew, mousePosDelta;
    float mouseWheelMove = GetMouseWheelMove();
    dist *= pow(CameraMoveExponential, mouseWheelMove);
    if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT))
        mousePosPre = GetMousePosition();
    if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) {
        mousePosNew = GetMousePosition();
        mousePosDelta.x = mousePosNew.x - mousePosPre.x;
        mousePosDelta.y = mousePosNew.y - mousePosPre.y;
        mousePosPre = mousePosNew;
        yaw += -SENSITIVITY * mousePosDelta.x;
        pit += -SENSITIVITY * mousePosDelta.y;
        pit = VAL_LIMIT(pit, -1.57, 1.57);
    }
    Vector3 vec = (Vector3){cosf(pit)*cosf(yaw), cosf(pit)*sinf(yaw), sinf(pit)};
    vec = Vector3Scale(vec, dist);
    camera->position = Vector3Subtract(camera->target, vec);
}

第一视角

WSAD分别控制视角的前后左右移动,EQ分别控制上下移动,滚轮控制移动速度。

#include "camera.h"
#include <math.h>

#define CameraMoveSpeedInit              0.2f
#define VAL_LIMIT(x, min, max)           (((x)<=(min) ? (min) : ((x)>=(max) ? (max) : (x))))
#define MouseMoveSensitivity             0.003f
#define MouseScrolSensitivity            1.5f
#define CameraMoveExponential            1.2f

typedef struct {
    Vector3 r;
    Vector3 v;
} RadiusVelocity;

typedef enum {
    MOVE_FRONT = 0,
    MOVE_BACK,
    MOVE_RIGHT,
    MOVE_LEFT,
    MOVE_UP,
    MOVE_DOWN
} KeyMoves;

float pit, rol, yaw;
Vector2 previousMousePosition;
const int moveControl[6] = { 'W', 'S', 'D', 'A', 'E', 'Q' };
float CameraMoveSpeed = CameraMoveSpeedInit;

void SetCameraSpeed(float speed) {CameraMoveSpeed=speed;}
float GetCameraSpeed() { return CameraMoveSpeed; }

void Init_Camera(Camera *camera)
{
    camera->position = (Vector3){ 0.0f, -30.0f, 30.0f };
    camera->target = (Vector3){ 0.0f, 0.0f, 0.0f };
    camera->up = (Vector3){ 0.0f, 0.0f, 1.0f };
    camera->fovy = 45.0f;
    Vector3 delta = Vector3Subtract(camera->target, camera->position);
    pit = atan(delta.z / sqrt(delta.x*delta.x + delta.y*delta.y));
    rol = 0;
    yaw = atan2(delta.y, delta.x) - PI/2;
    pit = VAL_LIMIT(pit, -1.57f, 1.57f);
    previousMousePosition = GetMousePosition();
    CameraMoveSpeed = CameraMoveSpeed;
    DisableCursor();
}

void Update_Camera(Camera *camera)
{
    Vector2 mousePositionDelta;
    Vector2 mousePosition = GetMousePosition();
    float mouseWheelMove = GetMouseWheelMove();
    CameraMoveSpeed *= pow(CameraMoveExponential, mouseWheelMove);
    char direction[3] = {
        IsKeyDown(moveControl[MOVE_RIGHT]) - IsKeyDown(moveControl[MOVE_LEFT]),
        IsKeyDown(moveControl[MOVE_FRONT]) - IsKeyDown(moveControl[MOVE_BACK]),
        IsKeyDown(moveControl[MOVE_UP])    - IsKeyDown(moveControl[MOVE_DOWN]),
    };
    mousePositionDelta.x = mousePosition.x - previousMousePosition.x;
    mousePositionDelta.y = mousePosition.y - previousMousePosition.y;
    previousMousePosition = mousePosition;
    float dx = direction[0] * CameraMoveSpeed;
    float dy = direction[1] * CameraMoveSpeed;
    float dz = direction[2] * CameraMoveSpeed;
    camera->position.x += dx * cos(pit)*cos(yaw) - dy * cos(pit)*sin(yaw);
    camera->position.y += dx * cos(pit)*sin(yaw) + dy * cos(pit)*cos(yaw);
    camera->position.z += dz + dy*sin(pit);
    pit -= (MouseMoveSensitivity * mousePositionDelta.y);
    yaw -= (MouseMoveSensitivity * mousePositionDelta.x);
    pit = VAL_LIMIT(pit, -1.57f, 1.57f);
    camera->target.x = camera->position.x - cosf(pit)*sinf(yaw);
    camera->target.y = camera->position.y + cosf(pit)*cosf(yaw);
    camera->target.z = camera->position.z + sinf(pit);
}

画正方体线框

在这里插入图片描述

#include "camera.h"
typedef unsigned char  u8;
#define SIDEWIDTH      3

int main(void) {
    Camera camera;
    Vector3 Pstart, Pend;
    u8 state;
	SetConfigFlags(FLAG_MSAA_4X_HINT);
    SetTargetFPS(60);
    SetWindowMonitor(1);
    SetConfigFlags(FLAG_FULLSCREEN_MODE);
    InitGraph(0, 0, "RayLib-3D");
	Init_Camera(&camera);

    while (!WindowShouldClose()) {
        Update_Camera(&camera);
        BeginDrawing();
            ClearBackground(RAYWHITE);
            BeginMode3D(camera);
                // DrawGrid(120, 6);
                for (u8 i = 0; i < 8; i++) {
                    Vector3 Pstart = (Vector3){
                        SIDEWIDTH * ((((i & 0x01) >> 0) << 1) - 1),
                        SIDEWIDTH * ((((i & 0x02) >> 1) << 1) - 1),
                        SIDEWIDTH * ((((i & 0x04) >> 2) << 1) - 1),
                    };
                    for (u8 j = 0; j < 3; j++) {
                        state = i ^ (1 << j);
                        Vector3 Pend = (Vector3){
                            SIDEWIDTH * ((((state & 0x01) >> 0) << 1) - 1),
                            SIDEWIDTH * ((((state & 0x02) >> 1) << 1) - 1),
                            SIDEWIDTH * ((((state & 0x04) >> 2) << 1) - 1),
                        };
                        DrawLine3D(Pstart, Pend, BLACK);
                    }
                }
            EndMode3D();
            DrawText(TextFormat("%2i FPS", GetFPS()), 0, 0, 20, LIME);
        EndDrawing();
    }
    CloseGraph();
    return 0;
}

球面上均匀取点

在这里插入图片描述

#include "camera.h"
#include <ctime>
// #define _USE_MATH_DEFINES
#include <cmath>
#include <random>
#include <iostream>
using namespace std;

class randEngine {
public:
    randEngine() {
        _gen.seed(time(0));
        _gen = std::default_random_engine((unsigned int)time(0));
        // _NormDis = std::normal_distribution<double>(0, 1);
        _UniFloatDis = std::uniform_real_distribution<double>(0, 1);
        // _UniIntDis = std::uniform_int_distribution<unsigned>(0, N - 1);
    }
    double rand01() { return _UniFloatDis(_gen); }
private:
    std::default_random_engine _gen;  // 生成初始化种子
    // std::normal_distribution<double> _NormDis;  // 正态分布
    std::uniform_real_distribution<double> _UniFloatDis;  // [0,1]均匀分布
    // std::uniform_int_distribution<unsigned> _UniIntDis;  // 整数均匀分布
};

int main(void) {
    Camera camera;
    SetConfigFlags(FLAG_MSAA_4X_HINT);
    SetTargetFPS(60);
    SetWindowMonitor(1);
    SetConfigFlags(FLAG_FULLSCREEN_MODE);
    InitGraph(0, 0, "RayLib-3D");
    Init_Camera(&camera);

    srand(time(0));
    vector<Vector3> points;
    double theta1, theta2;
    Vector3 vec;
    randEngine re;
    for (uint32_t i = 0; i < 1000; i++) {
        // theta1 = re.rand01()*M_PI-M_PI_2;
        theta1 = acos(re.rand01()*2-1)-M_PI_2;
        theta2 = re.rand01()*M_PI*2;
        vec.x = cos(theta1) * cos(theta2);
        vec.y = cos(theta1) * sin(theta2);
        vec.z = sin(theta1);
        points.push_back(vec);
    }

    while (!WindowShouldClose()) {
        Update_Camera(&camera);
        BeginDrawing();
        ClearBackground(RAYWHITE);
        BeginMode3D(camera);
            DrawGrid(120, 2);
            for (uint32_t i = 0; i < points.size(); i++)
                DrawSphere(points[i], 0.01, BLACK);
        EndMode3D();
        DrawText(TextFormat("%2i FPS", GetFPS()), 0, 0, 20, LIME);
        EndDrawing();
    }
    CloseGraph();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

raylib一些示例代码 的相关文章

  • angular6解析模板字符串,$compile服务在angular6中的实现方法

    angular6解析动态字符串模板 依赖 xff1a Compiler服务viewContanierRef服务 步骤 xff1a 创建指令 xff0c 并通过指令接受字符串接受字符串 xff0c 并通过此字符串动态创建组件及模块compil
  • “JSON parse error: Unexpected character (‘1‘ (code 49))的解决方式

    现在是 xff1a 2022年4月30日22 29 49 大家好 xff0c 我是雄雄 刚刚在调用接口的时候 xff0c 出现了个错误 xff1a span class token punctuation span span class t
  • springboot实现用户统一认证、管理-前端实现

    大家好 xff0c 我是雄雄 xff0c 欢迎关注微信公众号 xff1a 雄雄的小课堂 前言 现在是 xff1a 2022年6月2日15 43 51 上篇文章讲述了springboot中实现用户统一认证的具体内容 xff0c 主要从后端角度
  • Settings 添加一级菜单

    Settings添加一级菜单 xff1a 1 一级菜单项的实现是Activity 例如MySettings java xff0c 此类文件直接继承的是Activity xff0c 添加比较简单 xff08 1 xff09 在清单文件中添加如
  • Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 4171 异常的解决方法

    在做本地json文件的解析时遇到了这个问题 原代码为 64 RequestMapping value 61 34 readJson1 34 public String readJson1 String cityJsonCode json解析
  • Visual Studio 中 Tab 转换为空格的设置

    在 Visual Studio 中写代码时 xff0c 按 Tab 键 xff0c 会自动进行缩进 有时希望实现按 Tab 键 xff0c 出现多个空格的效果 Visual Studio 提供了这样的功能 xff0c 具体设置方法为 xff
  • 剑指offer—03

    剑指 Offer 03 数组中重复的数字 找出数组中重复的数字 在一个长度为 n 的数组 nums 里的所有数字都在 0 xff5e n 1 的范围内 数组中某些数字是重复的 xff0c 但不知道有几个数字重复了 xff0c 也不知道每个数
  • JSONArray.remove(index)失败原因分析

    集合在执行remove方法的时候 xff0c 有两种执行方式 xff0c 第一种移除对象remove xff08 object xff09 xff0c 另一种根据下标移除remove xff08 intIndex xff09 错误案例 Li
  • 【批处理bat】暂停功能命令

    一 目的 对暂停功能做修改 二 功能 2 1屏蔽 pause gt nul 在原本的pause上使用右尖括号写入nul即可不显示任何内容 2 2修改 echo press anykey to continue XD 在pause前利用ech
  • AOSP的编译及刷机

    简介 众所周知 xff0c Android是开源的 xff0c AOSP xff08 Android Open Source Project xff09 为Android开源项目的缩写 作为一名Android开发 xff0c 掌握Andro
  • Linux常用命令记录(du、find、grep、hadoop/hdfs、sed、tar、tr)

    Linux常用命令 查询格式 语句1 语句2 语句3 xff1a 对语句1的输出结果进行语句2的判定 xff0c 然后对输出结果进行语句3的判定 如 xff1a cat a txt head 10 wc l 39 cat a txt 39
  • 虚拟机运行出现蓝屏的现象如何解决

    前两天给大家分享了如何在电脑上安装虚拟机 xff0c 听到有部分小朋友私信跟我反馈说 xff0c 自己本身电脑可以安装vm虚拟机但是他安装过后一运行就立马进入蓝屏修复界面 所以今天想跟大家分享一下遇见这种情况如何解决 xff08 本文以华硕
  • 小白也能学懂——子网划分(2)

    我前天讲了一下子网划分 xff0c 昨天比较忙碌就忘记写剩下的内容了 xff0c 今天吃过饭 xff0c 想给他补上 xff0c 主要还是细分一下子网划分的作用 xff0c 以及如果进行计算 xff0c 本章还不是算难 xff0c 但是计算
  • 三分钟告诉你什么是三层交换机!

    昨天上周我们讲了单臂路由和跨交换机传输 xff0c 今天想说一下三层交换机 xff0c 对了还有个小实验 xff0c 收到反馈说我每次都是在图里标注代码不够清晰 xff0c 所以接下来会在实际中把代码贴出来供大家复制使用 目录 一 三层交换
  • 链路聚合(二层链路和三层链路)

    昨天主要介绍了三层交换机 xff0c 今天顺其自然就讲到了链路聚合 xff0c 因为是交换机中一个比较重要的技术 xff0c 下面我们开始 目录 一 单臂路由和三层交换的复习 二 端口绑定技术 三 链路聚合 端口聚合 端口绑定实现的条件 四
  • 静态路由(也许是目前最全的)

    今天在公司 xff0c 新来了个实习生 xff0c 突然问道静态路由的问题 xff0c 他跟我讲他不会设置 然后我就很尴尬 xff0c 因为这个毕竟是基础知识嘛 所以今天整理了一下静态路由的知识 xff0c 跟大家分享一下 目录 一 路由器
  • C# 读取Json文件--代码示例

    1 C 读取Json文件 JsonConvert SerializeObject str object to string JsonConvert DeserializeObject obj string to json 2 Json文件创
  • 网络地址转换协议——NAT(恐怕是最全的版本)

    前天我说第二天要跟大家讲一下NAT的 xff0c 结果放假有些懒 xff0c 所以就放在今天更新 xff0c 希望大家不要凶我 xff0c 哈哈哈 目录 一 什么是NAT 1 NAT简介 2 NAT作用 3 NAT内网地址的范围 4 主要应

随机推荐

  • linux日志文件详解

    目录 一 日志文件的分类二 日志文件位置三 常见日志文件1 分析日志文件2 内核及系统日志 四 日志消息等级五 日志文件分析1 用户日志2 程序日志 六 日志分析注意事项 一 日志文件的分类 日志文件是用于记录Linux系统中各种运行消息的
  • 虚拟化与docker基础

    文章目录 一 虚拟化1 虚拟化概述2 虚拟化的功能3 虚拟化的三种模式4 容器与虚拟化 二 Docker1 容器概述2 Docker概述3 Docker的设计宗旨4 容器与虚拟机的区别5 容器在内核中支持两种重要的技术6 Docker核心概
  • Docker容器网络模式与数据管理

    文章目录 一 Docker容器操作1 容器创建2 查看容器的运行状态3 启动容器4 创建并开启容器5 终止容器运行6 容器的进入7 复制文件到容器中 宿主机中8 容器的导出与导入9 删除容器 二 Docker网络1 Docker网络实现原理
  • docker镜像的创建与dockerfile

    文章目录 一 docker镜像的创建1 创建镜像的方法2 基于现有镜像创建3 基于本地模板创建4 基于dockerfile创建 二 Dockerfile1 概述2 Dockerfile结构3 Dockerfile镜像结构的分层4 Docke
  • matlab中值滤波实现

    中值滤波是一种典型的非线性滤波 xff0c 是基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术 xff0c 基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值 xff0c 让周围的像素值接近真实的值从而消除孤立的噪声点 该方
  • 程序员的情人节

    今天是一个好的节日 xff0c 七夕呀 xff01 程序是最好的女朋友 xff0c 它是不会骗你的 它偶尔会发些小的情绪 只是你没有懂它
  • stm32-Hardfault及内存溢出的查找方法

    STM32内存结构 1 要点 1 1 两种存储类型 RAM 和 Flash RAM可读可写 xff0c 在STM32的内存结构上 xff0c RAM地址段分布 0x2000 0000 0x2000 0000 43 RAM size Flas
  • raylib部分源代码功能解读

    官网 https www raylib com https github com raysan5 raylib 我根据自己的需求裁剪了多余功能后的代码 xff1a https gitee com xd15zhn raylib https g
  • 无量纲处理、量纲变换与实时仿真理论

    基本原理 万有引力公式 d 2 r
  • 局域网windows平台下时间同步

    最近单位出现很多应为系统时间不统一造成的问题 xff0c 如 客户机时间与服务器时间不同步 xff0c 而客户机使用软件是读取本机时间上传服务器 xff0c 这样就会造成排序错误 每次开机修改很繁琐 我就想到了在局域网内假设时间服务器的想法
  • 水下潜航器的建模与控制

    线性系统理论大作业 待完成 题目 水下潜器模型 xff0c 可能是潜艇或者鱼雷等对象 一个主推进螺旋桨 xff0c 前后两对水平陀翼 xff0c 后面一对垂直陀翼 潜器前进过程中 xff0c 通过调节助推进螺旋桨推力 xff0c 以及三对陀
  • 演化博弈、复制动态方程与仿真

    本文只整理和总结一下我的理解 xff0c 文末列出了可供参考的更详细完整的资料 建议先看参考资料 1 xff08 博弈论公开课 xff09 的博弈论课程 xff0c 可以直接从第11讲开始看 参考链接 2 是关于演化博弈非常经典的一本书 参
  • 演化博弈方法用于多智能体系统最优资源分配

    演化博弈方法用于多智能体系统最优资源分配 Evolutionary game theoretic approach for optimal resource allocation in multi agent systems 论文复现见 论
  • [论文复现]演化博弈方法用于多智能体系统最优资源分配

    原文 演化博弈方法用于多智能体系统最优资源分配 CSDN博客 https ieeexplore ieee org document 8243778 问题描述 有2种资源分配给6个个体 xff0c 2种资源的总量分别为 y 1 61 545
  • 基于博弈学习的分布式卫星任务规划

    基于博弈学习的分布式卫星任务规划 Distributed Satellite Mission Planning via Learning in Games 摘要 对地观测卫星群的任务规划是一个复杂的问题 xff0c 它提出了重大的理论和技术
  • 多星分布式任务分配中的博弈自组织

    多星分布式任务分配中的博弈自组织 Game theoretic self organization in multi satellite distributed task allocation 论文复现见 论文复现 多星分布式任务分配中的博
  • 自用的矩阵运算库zhnmat使用说明

    自用的矩阵运算库zhnmat使用说明 包含两个主要类 xff1a Mat和Vector3d xff0c 可以用于一些简单的矩阵和三维向量场景 xff0c 代码较简单 xff0c 没有任何性能优化 xff0c 可用于学习参考 代码仓库 htt
  • 非线性系统的反馈线性化

    仿射非线性或非仿射非线性指对输入是否是线性的 例如 xff0c 系统能够写成 x 61 f x
  • 基于特征模型的全系数自适应控制

    摘要 xff1a 首先推导了全系数和等于1的证明过程 xff0c 分析了等效时间常数的概念 xff0c 然后推导了递推最小二乘公式并用于参数辨识的方法 xff0c 最后给几个仿真的例子 全系数之和等于1 被控对象用微分方程 y n
  • raylib一些示例代码

    摘要 xff1a 几种相机视角 3D预览图视角 xff1a 鼠标拖动 xff0c 滚轮缩放 只能沿着中心点 第一视角 xff1a WSAD分别控制视角的前后左右移动 xff0c EQ分别控制上下移动 xff0c 滚轮控制移动速度 画正方体线