小神之Newton物理引擎教程(一) Newton物理引擎教程
第一节 Getting started
这个例程将告诉你如何把 newton 物理引擎和你的图形引擎结合起来。
如果你没有解过 SDK 包,先解开包。
打开 Visual studio 找到包里的 Tutorials.dsw 后双击。
选择子项目 Tutorial 1 getting started 并使它活动起来。
选择 Tutorial.cpp 文件并双击在编辑框中打开。
在文件的开始你将发现 include 部分。
看下面几行(注意黑体):
#include “newton.h”
#include "tutorial.h"
#include "HiResTimer.h"
#include "RenderPrimitive.h"
#include "Newton.h"
找到文件主要函数。
首先初始化图形引擎。在这个案例中我们已经把 opengl 的初始化压成一个简单的函数。它可以完成你的引擎中主要系统的初始化。
// Initialize opengl
InitOpenGl (argc, argv, "NewtonGetting Started", DrawScene, NULL, Keyboard);
接下来你将看到场景初始化的的相关调用。
// Create the physics scene. This represents your engine scene initialization
InitScene();
最后是 opengl 的主体循环调用,它描述的是你的引擎主循环。
现在找到函数 InitScene , 物理引擎的初始化就在那里。
在这个例程中,我们将实现一个简单的物理场景:一个刚体球悬浮在真空中。
我们将看到:
// Create the newton world
nWorld = NewtonCreate (NULL, NULL);
// 译者注:实际上这之前还需要声明 nWorld ,以下许多地方类似
它将为 nowton 世界创建一个句柄,并初始化所有内部结构。这里我们先忽视两个参数,在下个例程中我们将对之详细说明。我们保持这个指向 nowton 世界的句柄为全程变量。
但是它( nowton 世界)不可能脱离 opengl 循环,所以我们要设定一个事件去终止 nowton 世界和我们已经分配的所有资源。这就是 onexit (Cleanup) 所要做的。
接下来我们要创建一个刚体,在这之前我们要创建它的几何碰撞。(刚体每时每刻都必须有几何碰撞)
所以我们根据图形箱子大小去创建一个碰撞。
// Create the collision shape
collision = NewtonCreateBox (nWorld, box.m_x * 2.0f, box.m_y * 2.0f, box.m_z * 2.0f, NULL);
第一个参数是 Newton world ,接下来的是箱子大小,最后一个参数是用来设置从源刚体而得到的几何碰撞中偏转转换矩阵。当使用 Null 时,这个箱子会被源物体替代。现在我们创建刚体并保存为一个全局变量。
// Create the ridid body
ribidBodyBox = NewtonCreateBody (nWorld, collision);
当你使用完碰撞对象后你要释放它,碰撞对象在 newton 里是唯一一个使用 reference 数的对象,这是有必要的因为其他刚体可以分享几何碰撞。取个例子来说,你可以创建很多个同样大小的箱子,你可以使用同一个几何碰撞。
// Get rid of the collision
NewtonReleaseCollision (nWorld, collision);
当 newton 创建一个刚体,质量设置为无限以保持这个刚体呈静态。我们需要去告诉 newton 这个物体是动态的,就调用下面这个
// set the body mass and inertia
NewtonBodySetMassMatrix (ribidBodyBox, 1.0f, 1.0f, 1.0f, 1.0f);
别去考虑质量与惯性,他们将会在例程 the Dealing with Mass and Inertia 中讨论。
我们同样需要在这个世界中物体的位置。
// Set the transformation matrix 设置变换矩阵
dMatrix matrix (box.GetMatrix());
matrix.m_posit.m_x = 0.0f;
matrix.m_posit.m_y = 1.0f;
matrix.m_posit.m_z = 0.0f;
NewtonBodySetMatrix (ribidBodyBox, &matrix[0][0]);
这里没有应力和应变应用在这个物体上,我们仅仅是应用了最初的角速度 。
// Animate the body by setting the angular velocity 设置角速度使物体动起来
dVector omega (1.0f, 1.0f, 1.0f);
NewtonBodySetOmega (ribidBodyBox, &omega[0]);
// 这里的 NewtonBodySetOmega 中的 Omega 其实是小写希腊字母最后一个—— ω ,即物理中的角速度。
这是所有初始化,现在是主要的仿真循环。
每一帧在 OPENGL 或者你的引擎中都将在主要仿真循环中创建一个回调。在这个例程中,它是函数 DrawScene 。
注意我们需要取得从最后一次更新到现在的时间。它使用下面这个函数。
// get the time step
timeStep = timer.GetElapsedSeconds();
接下来,我们调用 NewtonUpdate 来用时间量推动这个世界。
// update the Newton physics world
NewtonUpdate (nWorld, timeStep);
现在我们需要找到在世界更新的过程中位置改变的物体变换矩阵,在这个例子中我们只有一个物体。
// get the matrix from the rigid body
dMatrix matrix;
NewtonBodyGetMatrix(ribidBodyBox, &matrix[0][0]);
现在我们需要去应用这些转换到图形物体中。
// Set the matrix of the visual body
box.SetMatrix (matrix);
最后我们渲染场景。
// Render the object
glPushMatrix();
box.Render();
glPopMatrix();
这些都包含在主循环中。
最后的事情就是终止应用程序,我们用点击关闭窗体按钮或者按 ESCAPE 键来终止。每个案例都是用 exit(0) 。
这个函数将会调用所有终止程序并次序颠倒的运行。在我们的案例中我们仅仅是使用 cleanup 函数去销毁 the Newton world 。
操作这个例程用 WSAD 键。
改变运动趋势按鼠标并移动鼠标。
例程结束。
从这个例程中我们可以看出,物理引擎的基本操作步骤。
1、 初始化物理引擎。
2、 取得物体的几何碰撞。
3、 根据几何碰撞创建刚体。
4、 释放几何碰撞(很多人会忘记,但很重要)
5、 设置变换矩阵。
6、 更新物理引擎。
7、 取得变换矩阵。
8、 根据取得的变换矩阵设置绘制物体当前状态。
9、 释放物理引擎。
小神之Newton物理引擎教程(一) Newton物理引擎教程相关推荐
- webGL、webGPU、封装、渲染引擎 three.js、游戏引擎,定位是游戏开发,在前面的渲染引擎基础上,还提供了骨骼动画、物理引擎、AI、GUI 等功能,以及可视化编辑器来设计关卡,支撑大型游戏
https://zhuanlan.zhihu.com/p/162878354 如何选择 WebGL 框架和引擎? 知道得越多,不知道的就更多了 数据可视化Sugar-百度智能云 cloud.ba ...
- ClickHouse系列教程三:MergeTree引擎分析
ClickHouse系列教程: ClickHouse系列教程 Clickhouse之MergeTree引擎分析 CRUD Clickhouse支持查询(select)和增加(insert),但是不直接 ...
- 神舟z7m安装Linux,神舟战神Z7M-CT7GS笔记本win10系统下载与安装教程
神舟战神Z7M-CT7GS笔记本是一款拥有酷睿i7第9代处理器+高速存储性能爆款笔记本电脑,今天小编整理了神舟战神Z7M-CT7GS笔记本win10系统下载与安装教程,有需要的用户,请来看看吧. 随着 ...
- 神舟服务器安装系统,神舟UT47笔记本一键u盘装系统win10教程
神舟UT47笔记本被称为神舟UT超极本的价值.这款笔记本采用了铝合金材质机身,该机顶盖采用铝合金材质,再者机身部分出边框外也采用相同材质.用料比较出色,但做工只算中规中矩,这或许就是想高性价比的妥协, ...
- linux显卡驱动安全模式,大神设置win7在安全模式安装显卡驱动详细的教程?
大神设置win7在安全模式安装显卡驱动详细的教程? 许多用户询问说win7怎么在安全模式安装显卡驱动?什么是显卡驱动?它是一种硬件所对应的软件,支持计算机与设备之间的通信,无驱动程序,计算机的硬件就无 ...
- xp系统安装c语言教程,神舟战神K670C-G4A1笔记本u盘重装系统xp教程
神舟战神K670C-G4A1笔记本预装Windows 10系统,搭载了Intel Pentium G5420处理器,主频为3.8GHz,而三级缓存为L3 4M.另外,电脑还配置了8GB运行内存,而最大 ...
- Unity 3D 物理引擎简介 || Unity 3D 物理材质|| Unity 3D 力(AddForce)
Unity 3D 物理引擎简介 早期的游戏并没有强调物理引擎的应用,当时无论是哪一种游戏,都是用极为简单的计算方式做出相应的运算就算完成物理表现,如超级玛丽和音速小子等游戏. 较为常见的物理处理是在跳 ...
- JAE京东云引擎Git上传管理代码教程和京东云数据库导入导出管理
文章目录 Git管理准备工作 Git工具上传代码 发布代码装程序 mywebsql管理 京东云引擎小结 JAE京东云引擎是京东推出的支持Java.Ruby.Python.PHP.Node.js多语言. ...
- win7系统开启telnet服务器,小编教你win7系统开启Telnet命令的详细教程
小编教你win7系统开启Telnet命令的详细教程 发布时间:2020-01-21 小编:yongzhi 浏览数: Telnet命令是很多人都会使用的一个编程命令,它可以测试端口号是否正常,而最近有小 ...
- gom引擎登录器_GOM传奇引擎微端配置详细架设语音教程
今天分享的教程:GOM引擎微端配置详细语音教程 什么是微端? 就是玩家不需要下载补丁文件,就可以进入游戏并显示游戏界面. 玩家玩到那里,补丁文件就自动更新到那里.当然支持微端的引擎不是很多. 比如LE ...
最新文章
- GitHub超4.1万星,最全Python入门算法来了
- 生成对抗网络在深度学习中占据非常重要的位置
- C语身教程第七章:布局与联结(5)
- 技术领导力实战笔记一
- 再有人问 Java 中的注解就把这篇文章丢给他!
- 数据挖掘——我们能从股市数据得出什么,以及一些算法
- mysql 全文检索 教程_MySQL:详细说明MySQL全文检索图文详细教程
- ASP.NET Core 源码学习之 Options[3]:IOptionsSnapshot
- Teamviewer 手机端怎么使用右键-已解决
- 李洪强-C语言5-函数
- 微信小程序接口测试时appid为空如何解决
- java迭代法求圆周率用梯形_感悟数学“近似计算”之美——“望星楼”里的圆周率...
- LeetCode 96.不同的二叉搜索树(卡特兰数)
- java飞机订票系统课程设计_JAVA数据结构课程设计,航空订票系统求助
- css3实现奔跑的小人动画
- STM32显示软件取模图片
- 西门子real是什么数据类型_西门子PLC的数据类型及数据转换
- 嵌入式软件面试题整理
- clickhouse 离线安装
- firnbsp;提交的版本的iphone4amp;nbs…
热门文章
- jdbc连接mysql驱动方式_JDBC连接数据库系列教程 – JDBC注册驱动的常见方式
- c语言中注释部分执行,深入C语言内存区域分配(进程的各个段)详解
- layui树形父子不关联_DP专题7 | 没有上司的舞会 洛谷1352(树形DP)
- linux中terminal中编译源码,分享|Terminator:一款一个窗口包含多个终端的 Linux 终端仿真器...
- 接口入参形式_极光小课堂|手把手教你做接口测试
- c语言链表容易犯的错误,急求大牛啊这个容易的链表到底在哪出错了
- IC/FPGA校招笔试题分析(三)
- 【 MATLAB 】使用 impz 函数计算并画出脉冲响应
- 离散时间复指数序列的周期性质
- FIR滤波器设计(包括Verilog HDL设计以及MATLAB设计)