编译bullet
㈠ Sweating Bullets (2004 Digital Remaster) 歌词
歌曲名:Sweating Bullets (2004 Digital Remaster)
歌手:Megadeth
专辑:Greatest Hits: Back To The Start (Digital Only)
Megadeth - Sweating Bullets汗水浸湿弹头
编译:jion
Hello me ... Meet the real me嗨,我……来会会真的我
And my misfits way of life还有我一团糟的生活
A dark black past is my过去漆黑一片
Most valued possessions生命毫无价值
Hindsight is always 20-20马后炮倒是灵光
But looking back it's still a bit fuzzy回想那些只言片语
Speak of mutually assured destruction?似曾狂言毁灭对方?
Nice story ... Tell it to Reader's Digest !!!故事不错……看这胡言乱语谁能领会!!!
Feeling paranoid就像个妄想狂
True enemy or false friend?真实的敌人还是虚伪的朋友?
Anxiety's attacking me, and焦虑将我侵袭
My air is getting thin玩命喘着粗气
I'm in trouble for the things我陷入了麻烦
I haven't got to yet却不知我做了什么
I'm chomping at the bit and my我嚼着舌头
Palms are getting wet, sweating bullets手心在冒汗,浸湿了弹头
Hello me ... It's me again嗨,我……我又来了
You can sube, but never tame me管你使什么手段,别想把我驯服
It gives me a migraine headache你让我头痛预裂
Thinking down to your level被你牵着鼻子走
Yea, just keep on thinking it's my fault尽管把错误归咎于我
And stay an inch or two outta kicking distance站在一旁等着瞧吧
Mankind has got to know总有石破天惊的一天
His limitations你试试忍耐的极限!
Feeling claustrophobic幽闭与恐惧占据了心灵
Like the walls are closing in围墙逼近眼前
Blood stains on my hands and手上满是鲜血
I don't know where I've been我不知我身在何处
I'm in trouble for the things我陷入了麻烦
I haven't got to yet却不知我做了什么
I'm sharpening the axe, and my我磨着斧子
Palms are getting wet, sweating bullets手心在冒汗,浸湿了弹头
SOLO
Well, me ... It's nice talking to myself不错,我……和自己聊天挺有意思
A credit to dementia精神分裂的好处
Some day you too will know my pain总有一天你也要感受这痛苦
And smile its black tooth grin咧着黑牙傻笑
If the war inside my head脑中永不停歇的争斗
Won't take a day off I'll be dead终将害我死去
My icy fingers claw your back我用冰冷手指钳住你脖子
Here I come again我又来了
Feeling paranoid就像个偏执狂
True enemy or false friend? 真实的敌人还是虚伪的朋友?
Anxiety's attacking me, and焦虑将我侵袭
And my air is getting thin玩命喘着粗气
Feeling claustrophobic幽闭与恐惧占据了心灵
Like the walls are closing in围墙逼近眼前
Blood stains on my hands and手上满是鲜血
I don't know where I've been我不知我身在何处
Once you committed me你们将我投入狱中
Now you've acquitted me现在又要判我无罪
Claiming validity判决有效
For your stupidity为了你等的愚行
I'm chomping at the bit我嚼起舌头
I'm sharpening the axe我磨起斧子
Here I come again, whoa!我又来了,哇!
Sweating bullets汗水浸湿了弹头
http://music..com/song/2585698
㈡ flash as3.0初级问题
因为 Event.target 返回类型是 Object类型,虽然这里确实返回的是MovieClip,但这只是因为 MovieClip 是由 Object 类继承来的,MovieClip能强制转换成Object而反之则不能,所以把e.target赋给MovieClip类型的obj的时候,在严谨模式下会发生编译错误
解决方法有两个
一个是直接去掉 var obj:MovieClip = e.target; 里的MovieClip,改成:
var obj = e.target;
另一个方法就是取消严谨模式,方法是选择 文件--->发布设置
选择Flash标签,点击“脚本:ActionScript 3.0”右边的“设置”按钮,消去“错误:严谨模式”前的勾
=======================================
LS的同学...严谨模式只是检查的e.target的定义类型Object和要赋给的obj的变量类型不匹配,而且无法隐式转换而已...
㈢ 紧急求助,请问如何在android 系统中通过ndk内嵌c版bullet物理引擎主要是如何编译bullet源代码...
http://blog.csdn.net/vagrxie/article/details/5928695
自己去SCDN看看吧
㈣ emscripten能不能直接编译ll中间代码
Emscripten是Mozilla的开发人员Alon Zakai所开发的一个独特LLVM后端,可以将LLVM中间码编译成javaScript,大大简化了现有代码在 Web时代的重用。
和Google Chrome尝试通过自有的Native Client在Web中利用现有C/C++库的方式不同,Mozilla寻求了一条普适性更强的解决方案。
Emscripten并非通常的LLVM后端,本身使用JavaScript写成。它可以将任何通过LLVM 前端(比如 C/C++ Clang)生成的LLVMIR中间码编译成JavaScript,从而显着降低移植现有代码库到Web环境的损耗。
目前Emscripten已经比较成熟,准备发布2.0版本。很多大型的项目已经可以使用Emscripten转换为JavaScript了,比如Python、Ruby、Lua和Doom。
根据今年5月份的演示中用Firefox的测试结果显示,通过Emscripten 1.0得出的JavaScript在未经优化的情况,在不同的测试中比gcc -O3的原始C/C++代码约慢了0.89到3.75 倍左右。Alon表示在使用了类型推测等优化后性能会有进一步提升。
Alon Zakai在LLVM邮件列表中关于Emscripten的说明。这里有一个使用Emscripten转换后的Bullet/WebGL物理引擎演示。
㈤ 怎么在一个对象数组中写不同类得对象 希望能具体写出.
在Visual Studio .NET 2008环境中编译、运行通过,使用VC++开发:
#include "stdafx.h"
#include "iostream"
using namespace std;
//抽象基类CRole
class CRole
{
protected:
char *name;
public:
CRole(char *name)
{
this->name = name;
}
~CRole()
{
this->name = NULL;
}
virtual void printInfo() = 0;
};
//飞机类
class CPlane : public CRole
{
public:
CPlane(char *name):CRole(name){}
void printInfo()
{
cout<<"CPlane\t"<<name<<endl;
}
};
//坦克类
class CTank : public CRole
{
public:
CTank(char *name):CRole(name){}
void printInfo()
{
cout<<"CTank\t"<<name<<endl;
}
};
//子弹类
class CBullet : public CRole
{
public:
CBullet(char *name):CRole(name){}
void printInfo()
{
cout<<"CBullet\t"<<name<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CRole *arr[15]; //3架飞机、2部坦克,10颗子弹
int i;
arr[0] = new CPlane("歼10 1号");
arr[1] = new CPlane("歼11 1号");
arr[2] = new CPlane("歼10 2号");
arr[3] = new CTank("99式 1号");
arr[4] = new CTank("96式 1号");
arr[5] = new CBullet("5.45mm 1号");
arr[6] = new CBullet("5.8mm 1号");
arr[7] = new CBullet("5.45mm 2号");
arr[8] = new CBullet("5.8mm 2号");
arr[9] = new CBullet("5.45mm 3号");
arr[10] = new CBullet("5.8mm 3号");
arr[11] = new CBullet("5.45mm 4号");
arr[12] = new CBullet("5.8mm 4号");
arr[13] = new CBullet("5.45mm 5号");
arr[14] = new CBullet("5.8mm 5号");
for(i=0; i<15; i++)
{
arr[i]->printInfo();
}
return 0;
}
㈥ 后缀是个什么概念
文件名后缀的含义
说起来Windows工作界面下的文件名简直是随心所欲,比如:某编辑部的2000年工作计划。文件名即可用中文直接表达,而且长度最长可达256个字符,让人看起来真是一目了然。然而在Windows环境中,安装的软件中却大量存在着类似CALENDAR.EXE、GAMES.GRP等等的文件名,这又是为什么呢?原来这些文件名都是根据DOS环境的文件名命名规则而定的。
DOS环境下的文件名
在DOS下,文件名采用8+3结构,即:最长8位的文件名,由小数点分隔后再跟上最长3位的后缀名,如:READ.ME、SETUP.EXE,一般情况下文件名不允许使用汉字,只能由字母、数字和一些符号组成。如READ.ME用中文理解就是“读我”,即提示用户在使用软件前先看看这个文件的内容,以获取更多的提示信息。而更重要的是,DOS下规定用后缀名来区分各种不同的文件。
在DOS下最容易遇到的首先是可执行文件,后缀名有两类:*.exe、*.com(此处的*表示文件名任意),它们是由汇编语言或其它高级语言编出的程序经过编译后直接在DOS下运行的文件。有时由于软件功能多、内存偏小,不能一次性全部调入内存还可能有同文件名的ovl文件,如ws.exe、ws.ovl。另外还有一种文件可以直接运行,*.bat,即批处理文件,其中有许多命令或可执行文件名,主要用于提高工作效率,其中最有用的是Autoexec.bat,这个文件在开机时会被自动执行(自动执行在英文中就是Automatically execute)。而另外一种可以加载但不能直接运行的文件即是系统扩展管理文件*.sys(sys即系统system),它主要提供某些非标准设备如鼠标、扩充内存等的驱动程序,如mouse.sys、himem.sys。为了统一管理还专门规定了一个config.sys的文本文件来一次性地在开机时自动调入这些必需的设备驱动程序,这些文件一旦被误删或换名或被病毒侵袭则将直接导致系统工作不正常。
DOS下字处理产生的文件原本是可以不用后缀的,但人们常用*.txt表示(txt即文本text)。被所有的平台和所有应用程序支持。而为了管理方便,人们也可以用自己的名字做后缀来表示是自己建的文本文件,如我输入的很多文章即为*.mcj,为了便于用户在意外删掉原文件的情况下能尽快恢复原文件,许多字处理系统都提供了一种自动备份的功能,如我第二次编辑JIHUA.MCJ时(JIHUA:计划的汉语拼音),系统会先拷贝一份原文件为JIHUA.BAK。使用具有特殊格式功能的字处理软件,如求伯君先生早年推出的WPS,就会规定其后缀为.wps,用以标识是用WPS生成的文本文件。当使用字处理软件编辑高级语言程序时,后缀通常为相应语言的前三个字母(如:*.BAS即BASIC语言源程序,*.PAS为PASCAL语言程序,*.FOR为Fortran语言程序,*.C即为C语言,*.ASM即为汇编语言程序)。 伴随着可执行文件常附有以下几类文件:*.HLP即帮助文件(help)、*.CFG即配置文件(config)、*.DAT即数据文件(data)、*.LOG即日志文件(log)、*.TMP为临时文件(temporal)。
Windows环境下的文件名
绝大多数DOS文件名后缀在Windows下继续有效,但Windows本身也引出了许多种崭新的后缀名,如:*.drv为设备驱动程序(Driver)、*.fon和*.fot都是字库文件、*.grp为分组文件(Group)、*.ini为初始化信息文件 (Initiation)、*.pif为DOS环境下的可执行文件在Windows下执行时所需要的文件格式、*.crd即卡片文件(Card)、*.rec即记录器宏文件(Record)、*.wri即文本文件(Write),它是字处理write.exe生成的文件、*.doc和*.rtf也是文本文件(Document),它们是Word产生的文件、*.cal为日历文件、*.clp是剪贴板中的文件格式、*.htm和 *.html即主页文件、*.par为交换文件、*.pwl为口令文件(Password)等等。
图像文件名后缀进入多媒体世界后,大家会看到各种各样精彩的图片,会发现许多种后缀名。的确,由于各个公司在开发图形有关的软件时都自制标准,导致今日在图形方面有太多的格式,以下就是常见的几种格式:
首先是一种位图文件格式,它是一组点(像素)组成的图像,它们由图像程序生成或在扫描图像时创建。主要有Windows位图(.BMP):由Microsoft公司开发,它被Windows和Windows NT平台及许多应用程序支持。支持32位颜色,用于为Windows界面创建图标的资源文件格式,光标(.CUR、.DLL、.EXE):资源文件格式,用于创建Windows界面的光标。OS/2位图(.BMP):Microsoft公司和IBM开发的位图文件格式。它为各种操作系统和应用程序所支持。支持压缩,最大的图像像素为64000×64000。画笔(.PCX):由Zsoft公司推出,它对图像数据也进行了压缩,可由PCX生伞S糜赪indows的画笔。支持24位颜色,最大图像像素是64000×64000。支持压缩。图形交换格式(.GIF): ( Graphics Interchage Format):由Compu Serve创建,它能以任意大小支持图画,通过压缩可节省存储空间,还能将多幅图画存在一个文件中。支持256色,最大图像像素是64000×64000。
Kodak Photo CD(.PCD):Eastman Kodak所开发的位图文件格式,被所有的平台所支持,PCD支持24位颜色,最大的图像像素是2048×3072,用于在CD-ROM上保存照片。
Adobe Photoshop(.PSD):Adobe Photoshop的位图文件格式,被Macintosh和MS Windows平台所支持,最大的图像像素是30000×30000,支持压缩,广泛用于商业艺术。
Macintosh绘画(.MAC):Apple公司所开发的位图文件格式。被Macintosh平台所支持,仅支持单色原图,最大图像像素是576×720。支持压缩,主要用于在Macintosh图形应用程序中保存黑白图形和剪贴画片。
动画文件的后缀名
动画文件格式用于保存包含动画框架中的图形信息。主要有:Autodesk FLIC(.FLC):即.FLI,Autodesk Animator和AnimatorPro的动画文件格式。支持256色,最大的图像像素是64000×64000,支持压缩。广泛用于动画图形中的动画序列、计算机辅助设计和计算机游戏应用程序。不大适合制作真实世界图像动画。
MacPICTS(.PCS,.PIC):Macromedia开发的动画文件格式,为Macintosh应用程序使用。支持256色,支持压缩,用于保存动画数据,是Quick Time的前身。
Microsoft资源互换文件格式,TIFF(.AVD):Microsoft公司开发的动画文件格式,被Windows、Windows NT平台和OS/2多媒体应用程序所支持,支持256色和压缩,用于在多媒体应用程序中保存音频、视频和图形信息。
MPEG(.MPEG):国际标准化组织的运动图像专家小组开发的动画文件格式。被所有平台和Xing Technologies MPEG播放器及其它应用程序所支持,支持压缩,最大图像像素是4095×4094×30帧/每秒。用于编码音频、视频、文本和图形数据。
Quick Time(.QTM):Apple计算机公司开发的动画文件格式。被Apple Macintosh和Microsoft Windows平台所支持,支持25位颜色,最大图像像素是64000×64000,支持压缩,用于保存音频和运动视频信息。
声音文件的后缀名
声音文件格式是用于保存数字音频信息的。它们主要有:
AIFF(.AIF):这是Apple计算机公司开发的声音文件格式,被Macintosh平台和应用程序所支持。支持压缩。
Amiga声音(.SVX):Commodore所开发的声音文件格式,被Amiga平台和应用程序所支持,不支持压缩。
MAC声音(.SND):Apple计算机公司开发的声音文件格式,被Macintosh平台和多种Macintosh应用程序所支持,支持某些压缩。
MIDI(.MID):国际MIDI协会开发的声音文件格式,被Windows平台和许多应用程序所支持,用于为乐器创建数字声音。
声霸(.VOC):Creative Labs公司开发的声音文件格式,被Windows和DOS平台所支持,支持压缩。
WAVE(.WAV):微软公司用作Windows平台上保存音频信息的资源格式。
压缩文件的后缀名
为了提高存储效率,许多公司都推出了压缩数据的方法和相应的软件,这类文件的使用主要通过压包和解包软件来进行,主要的后缀有:?arj、*.rar、*.lzh、*.jar。还有一些专用的压缩文件,如:*.ex_、*.dl_、*.d3_、*.cab等。
数据库类文件的后缀名
在Dbase、FoxBase、Foxpro系列软件的环境下有以下几类后缀:
.dbf 数据库文件(databasefile) .prg 命令文件(即程序Program)
.fxp 编译后的程序 .scx和.sct 屏幕文件
.fpt 备注字段文件 .frx和.frt 报表文件
.cbx和.pjt 标签文件 .mnx 和.mnt 菜单文件
.pjx和.pjt 工程文件 .app 应用文件
.cdx和.idx 索引文件 .qpr和.qpx SQL查询文件
.fp 配置文件 .ap 生成应用
.err 编译错误文件 .men 内存应用
.fky 键宏文件 .win 窗口文件
.pcb 库文件 .tmp 临时文件
.tbk 临时数据库文件
后记
用户要注意在不同的操作系统下,后缀名的约定会有所不同,如在Unix下,*.p代表Pascal语言程序,*.z代表压缩文件,*.tar代表归档文件。另外,针对极特殊的设备,其驱动程序也会有特殊的后缀,如3DS显示卡的驱动程序是*.exp。还有某些公司针对自己的产品也规定了文件名后缀,如方正公司的图像排版文件规定用*.grh(即Graph)。
文件名的后缀代表着某一种类型的文件,一般会由某一种特定的软件产生和处理。只有对这些后缀名的知识有一定的了解,才能在上机的过程中知道其所以然。这儿带着大家看到了常见的一些后缀类型,实际上还有很多类型,不可能全部讲完。常言说,师傅领进门,修行在个人,以后大家在计算机世界中自己转着看吧。
㈦ 如何使用Bullet物理引擎 碰撞检测
Bullet教程: Hello World 实例
更多信息请关注 物理引擎中文社区http://www.physicsengine.org
欢迎加qq群 52821727 讨论更多关于Bullet的东西
这篇文章里我们将尽可能简单的向你展示怎么使用Bullet, 怎样初始化Bullet, 设置一个动力学世界, 还有一个球落向地表 这个对鉴别你的build是否成功非常有用并且也能够让你快速的学习到Bullet的API. 首先,我们假设你的Bullet已经正确安装并且正确设置了Bullet的include路径(例如. /usr/local/include/bullet) 确保能连接到正确的lib. 否则请参阅Installation安装. 如果你用的是gcc来编译,请确保你的静态库反序,就是说. dynamics, collision, math.
初始化程序
以一个标准的hello world程序开始:
[cpp] view plain
#include <iostream>
int main ()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
创建世界
现在我们要添加一个子弹(Bullet)模拟. 首先写入以下语句:
#include <btBulletDynamicsCommon.h>
我们想把btDiscreteDynamicsWorld 实例化但是在做此之前我们还需要解决一些其他事情. 对于一个“hello world”例子来说它太复杂我们并不需要. 但是,为了能更符合我们自己的工程, 他们可以用来微调(fine-tuning)模拟环境.
我们需要指出使用什么样的 Broadphase algorithm(宽相算法). 选择什么样的泛型算法很总要,如果有许多刚体在绘制场景里, since it has to somehow check every pair which when implemented naively(天真) is an O(n^2) problem.
宽相(broadphase)使用 传统的近似物体形状并且被称之为代理.我们需要提前告诉子弹最大的代理数, 所以才能很好的分配内存避免浪费. 下面就是世界里任何时候的最大刚体数.
int maxProxies = 1024;
一些 broadphases 使用特殊的结构要求世界的尺度提前被告知, 就像我们现在遇到的情况一样. 该broadphase可能开始严重故障,如果离开这个物体体积. 因为 the AxisSweep broadphase quantizes 空间基于我们使用的整个空间的大小, 您想这差不多等于你的世界.
使它小于你的世界将导致重大问题, 使它大于你的世界将导致低劣的性能.这是你程序调整的一个简单部分, 所以为了确保数字的正确多花点时间也不防.
在这个例子中,世界从起点开始延伸10公里远。
[cpp] view plain
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
这个broadphase是我们将要使用的, 这个执行的是扫描和裁剪, 这里可以看到更多解释Broadphase .
[cpp] view plain
btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
该broadphase是一个极好的空间以消除不应碰撞的成队物体. 这是为了提高运行效率.
您可以使用碰撞调度注册一个回调,过滤器重置broadphase代理,使碰撞系统不处理系统的其它无用部分
. 更多信息请看 Collision Things.
碰撞配置可以让你微调算法用于全部(而不是不是broadphase )碰撞检测。这个方面现在还属于研究阶段
[cpp] view plain
* collisionConfiguration = new ();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
我们还需要一个"solver". 这是什么原因导致物体进行互动得当,考虑到重力,游戏逻辑等的影响,碰撞,会被制约。
它工作的很好,只要你不把它推向极端,对于在任何高性能仿真都有瓶颈有一些相似的可以线程模型:
[cpp] view plain
* solver = new ;
终于我们可以初始化了世界了:
[cpp] view plain
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
很明显我们把重力方向设置成了Y轴的负方向,即Y轴是像上的
[cpp] view plain
dynamicsWorld->setGravity(btVector3(0,-10,0));
子弹的政策是“谁分配,也删除” 记住,必须符合这样的结果
在main()后记的删除.
我们提供了一个通用的结果. 代码如下:
[cpp] view plain
#include <btBulletDynamicsCommon.h>
#include <iostream>
int main () {
std::cout << "Hello World!" << std::endl;
// Build the broadphase
int maxProxies = 1024;
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
// 设置好碰撞属性 和调度
* collisionConfiguration = new ();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
// 实际上的物理模拟器
* solver = new ;
// 世界.
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
// 这里做一些你想做的事
// 作为一个好的编程习惯 做好删除工作
delete dynamicsWorld;
delete solver;
delete dispatcher;
delete collisionConfiguration;
delete broadphase;
return 0;
}
碰撞包围体
我们将创造一个接地平面[静态刚体] ,和一个球体,将属于在地上[动态刚体] 。每个刚体需要参考碰撞包围体. 碰撞包围体只解决碰撞检测问题, 因此没有质量,惯性,恢复原状等概念. 如果您有许多代理,使用相同的碰撞形状[例如每飞船模拟是一个5单元半径范围]。这是个好做法,只有一个子弹形状的碰撞,并分享它在所有这些代理. 但是我们这里的两个刚体形状都不一样,所以他们需要各自的shape.
地面通常是向上的并且里原始点1米的样子. 地面会和远点交叉,但子弹不允许这样做,
因此,我们将抵消它的1米和用来弥补,当我们把刚体设置好以后。
[cpp] view plain
btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);
我们将让它从天上掉下来,它是一个球体,半径为1米.
[cpp] view plain
btCollisionShape* fallShape = new btSphereShape(1);
这里需要做碰撞形状的清理工作.
刚体
在,我们可以添加形状的碰撞到我们的现场,并将它们定位.
让我们先初始化地面. 它的方向是特定的, 子弹的四元数形式 x,y,z,w . 位置在地面下一米, 将要补充一米我们不得不做的. 运动状态在这里可以得到详细的说明:MotionStates
[cpp] view plain
btDefaultMotionState* groundMotionState =
new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,-1,0)));
在第一个和最后一个参数,在下面的构造函数中是质量和地表的惯性. 由于地面是静止的所以我们把它设置成0. 固定不动的物体,质量为0 -他是固定的.
[cpp] view plain
btRigidBody::btRigidBodyConstructionInfo
groundRigidBodyCI(0,groundMotionState,groundShape,btVector3(0,0,0));
btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);
最后我们把地面加到世界中:
[cpp] view plain
dynamicsWorld->addRigidBody(groundRigidBody);
新增下跌领域非常相似。我们将其置于50米以上的地面.
[cpp] view plain
btDefaultMotionState* fallMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50,0)));
由于它是动态刚体,我们将给予质量1公斤。我不记得如何计算一个球体的惯性,但是,这并不重要,因为子弹提供它的实现
[cpp] view plain
btScalar mass = 1;
btVector3 fallInertia(0,0,0);
fallShape->calculateLocalInertia(mass,fallInertia);
现在,我们可以建造刚体只是像以前一样,并把它加到世界中:
[cpp] view plain
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,fallInertia);
btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI);
dynamicsWorld->addRigidBody(fallRigidBody);
一个快速的解释btRigidBody::btRigidBodyConstructionInfo是为了; 物体的构建是通过某些参数的. 这是通过一个特殊的结构实现的。 该部分的btRigidBodyConstructionInfo被复制到物体当你建造的时候,并只用于在初始化的时候. 如果你想创建几千个属性一样的物体, 你只需要建立一个btRigidBodyConstructionInfo, 并通过它创建所有的.
开始模拟
这就是有趣的开始。我们会加强模拟200倍,间隔60赫兹. 这使它有足够的时间降落的地面上. 每一步, 我们都会打印出它离地面的高度.
这stepSimulation 在做你所期待, 不过他的接口确实很复杂. 读Stepping The World 以获得更多消息.
进后,我们审查的状态下降领域.位置和方向都封装在btTranform对象,我们摘录下降领域的运动状态. 我们只关心位置,我们退出变换getOrigin ( ) 。然后,我们打印y组成部分的立场载体.
[cpp] view plain
for (int i=0 ; i<300 ; i++) {
dynamicsWorld->stepSimulation(1/60.f,10);
btTransform trans;
fallRigidBody->getMotionState()->getWorldTransform(trans);
std::cout << "sphere height: " << trans.getOrigin().getY() << std::endl;
}
这应该产生一个输出看起来像这样的东西:
sphere height: 49.9917
sphere height: 49.9833
sphere height: 49.9722
sphere height: 49.9583
sphere height: 49.9417
sphere height: 49.9222
sphere height: 49.9
...
sphere height: 1
sphere height: 1
sphere height: 1
sphere height: 1
sphere height: 1
看起来不错迄今。如果你图这对输出迭代次数,你就会得到这个:
这个球体开始于地表的一米处. 这是因为取的是几何中心并且它的半径为1米. 这个球刚开始会有一个大的反弹然后渐渐的减缓弹起高度.
这是可以预料的实时物理引擎,但它可以尽量减少,增加频率的模拟步骤
. 试试再说!
现在你可以把这个动态世界代入你的程序 实时绘制出这个球体. 也可以看看其他的 Collision Shapes . 试试一堆盒子 或者圆柱体然后用一个球去扔向他们.
完整代码
[cpp] view plain
#include <iostream>
#include <btBulletDynamicsCommon.h>
int main (void)
{
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
int maxProxies = 1024;
btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
* collisionConfiguration = new ();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
* solver = new ;
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
dynamicsWorld->setGravity(btVector3(0,-10,0));
btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);
btCollisionShape* fallShape = new btSphereShape(1);
btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,-1,0)));
btRigidBody::btRigidBodyConstructionInfo
groundRigidBodyCI(0,groundMotionState,groundShape,btVector3(0,0,0));
btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);
dynamicsWorld->addRigidBody(groundRigidBody);
btDefaultMotionState* fallMotionState =
new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50,0)));
btScalar mass = 1;
btVector3 fallInertia(0,0,0);
fallShape->calculateLocalInertia(mass,fallInertia);
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,fallInertia);
btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI);
dynamicsWorld->addRigidBody(fallRigidBody);
for (int i=0 ; i<300 ; i++) {
dynamicsWorld->stepSimulation(1/60.f,10);
btTransform trans;
fallRigidBody->getMotionState()->getWorldTransform(trans);
std::cout << "sphere height: " << trans.getOrigin().getY() << std::endl;
}
dynamicsWorld->removeRigidBody(fallRigidBody);
delete fallRigidBody->getMotionState();
delete fallRigidBody;
dynamicsWorld->removeRigidBody(groundRigidBody);
delete groundRigidBody->getMotionState();
delete groundRigidBody;
delete fallShape;
delete groundShape;
delete dynamicsWorld;
delete solver;
delete collisionConfiguration;
delete dispatcher;
delete broadphase;
return 0;
}
㈧ 电脑中GPU是什么啊
图形处理器(英语:Graphics Processing Unit,缩写:GPU),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上图像运算工作的微处理器。
GPU是显示卡的“大脑”,它决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。2D显示芯片在处理3D图像和特效时主要依赖CPU的处理能力,称为“软加速”。3D显示芯片是将三维图像和特效处理功能集中在显示芯片内,也即所谓的“硬件加速”功能。显示芯片通常是显示卡上最大的芯片(也是引脚最多的)。现在市场上的显卡大多采用NVIDIA和 AMD-ATI两家公司的图形处理芯片。
拓展资料:
GPU主流供应商
intel:intel不但是世界上最大的CPU生产销售商,也是世界最大的GPU生产销售商。 intel的GPU在现在完全是集成显卡,用于intel的主板和intel的笔记本。要是只按发售数量计算,intel随着他主板发售的集成GPU占据了整个GPU市场的60%以上。
nVidia:现在最大的独立显卡生产销售商,旗下有民用的Geforce系列,还有专业的Quadro系列。其GPU具有cuda通用运算,PureVideo高清视频技术,PhysX物理加速,Optimus智能显卡切换等。
AMD(ATI):世界上第二大的独立显卡生产销售商,他的前身就是ATI。旗下有民用的Radeon系列,还有专业的FireGL系列等。就发售量和发售盈利方面,AMD显卡方面仍然略输于nv,不过两者不相伯仲,差距只是几个百分点。其GPU具有Stream通用运算,ATI Video Converter视频转码,UVD高清视频技术,Havok、Bullet和Pixelux DMM三种物理引擎等。
㈨ 编程:那种语言更能学到设计模式,架构思想呢
Q1:关于纯粹的面向对象语言?
初学者不要太执着于某些教材所谓的"纯粹的完全的"面向对象. 面向对象并不是像一些人想的那样silver bullet.. . 从面向对象和面向过程的相互关系中可以发现, 从设计模式的学习中中也可以发现: 两者不过是你中有我, 我中有你, 不可分离的.
Q2:关于语言与编程(模式)
借用大牛的话: 深入一种语言去编程才能深刻理解, 另外,可以多用几门语言(包括动态和编译的)有助于理解不同编程方式. 集中并深入一种语言去编程的能力, 也就是超越了一种特定的语言. java, C#, C++的区别只是在入手难易和应用领域不同. 个人还是认同C++之父的话, c++是程序员值得学习的语言, 它的表达能力强大, 某种程度能够cover另外两种. 但说到底, 高手都是通过深入而后超越一种语言得到了思想.
design pattern某种角度上可以看作是面向对象版本的数据结构. 而架构思想和一些框架都是多种模式结合的一种实现, 这些不是简单的学习来完全理解的. 建议依据实际工作和项目中的框架多多实战, 而模式又何止Gof的23种呢.
最后个人心得是:1必须多读程序,2尽量多写.
㈩ 我编译出来的Java界面按下K键时,一直是死循环,不知是何解
因为这一个判断一直没有执行,所以没break
if (mt.bullet.x < 0 || mt.bullet.x > 1000 || mt.bullet.y < 0 || mt.bullet.y > 1000) {
System.out.println("执行到这了吗??????????");
mt.bullet.isLive = false;
break;
}
Bullet类需要实现Runnable接口,那个被你注释了的run方法需要把它放出来,
Thread t=new Thread(bullet);
t.start();
这两行放在ShotEnemy方法的最后面。
这样应该就可以不会再死循环了。