#include "Scene.h"
#include "Primitives.h"
#include "Exercise.h"
#include "Vec2.h"
#include <iostream>
using namespace std;
#include <Inventor/nodes/SoMaterial.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/SbTime.h>
int Scene::xPoints=5;
int Scene::yPoints=5;
int Scene::zPoints=5;
float Scene::xSize=1.0f;
float Scene::ySize=1.0f;
float Scene::zSize=1.0f;
float Scene::step=0.01f;
float Scene::mass=1.0f;
float Scene::stiffness=10.0f;
float Scene::damping=0.01f;
Scene::Method Scene::method=EULER_MODIF;
Scene::Testcase Scene::testcase=SPRING1D;
Scene::Scene(void)
{
Init();
PrintSettings();
}
//some default call: -testcase hanging -method Euler -stiff 10 -mass 0.1 -step 0.003 -damp 0.01
Scene::Scene(int argc, char* argv[])
{
// defaults:
testcase = SPRING1D;
method = EULER_MODIF;
stiffness = 10.0f;
mass = 0.1f;
step = 0.003f;
damping = 0.01f;
int arg=1;
while(arg<argc)
{
//Testcase
if(!strcmp(argv[arg], "-testcase"))
{
arg++;
//for(unsigned int i=0; i<strlen(argv[arg]); i++) argv[arg][i] = tolower(argv[arg][i]);
if(!strcmp(argv[arg], "hanging"))
{
testcase=HANGING;
}
else if(!strcmp(argv[arg], "spring1d"))
{
testcase=SPRING1D;
}
else
{
cerr << "Unrecognized testcase " << argv[arg] << endl;
exit(1);
}
arg++;
}
//Integration method
else if(!strcmp(argv[arg], "-method"))
{
arg++;
//for(unsigned int i=0; i<strlen(argv[arg]); i++) argv[arg][i] = tolower(argv[arg][i]);
if(!strcmp(argv[arg], "euler"))
{
method=EULER;
}
else if(!strcmp(argv[arg], "backeuler"))
{
method=BACK_EULER;
}
else if(!strcmp(argv[arg], "eulermodif"))
{
method=EULER_MODIF;
}
else if(!strcmp(argv[arg], "midpoint"))
{
method=MIDPOINT;
}
else
{
cerr << "Unrecognized method " << argv[arg] << endl;
exit(1);
}
arg++;
}
//Object size
else if(!strcmp(argv[arg], "-size"))
{
xPoints=atoi(argv[++arg]);
yPoints=atoi(argv[++arg]);
zPoints=atoi(argv[++arg]);
arg++;
}
//Step size
else if(!strcmp(argv[arg], "-step"))
{
step=(float)atof(argv[++arg]);
arg++;
}
//Stiffness
else if(!strcmp(argv[arg], "-stiff"))
{
stiffness=(float)atof(argv[++arg]);
arg++;
}
//Damping
else if(!strcmp(argv[arg], "-damp"))
{
damping=(float)atof(argv[++arg]);
arg++;
}
//Mass
else if(!strcmp(argv[arg], "-mass"))
{
mass=(float)atof(argv[++arg]);
arg++;
}
//Others
else
{
//Print instructions
cerr << endl << "Unrecognized option " << argv[arg] << endl;
cerr << "Usage: Test.exe -[option1] [settings] -[option2] [settings] ..." << endl;
cerr << "Options:" << endl;
cerr << "\t-testcase [spring1d,hanging,falling,circle]" << endl;
cerr << "\t-method [Euler,LeapFrog,Midpoint,BackEuler]" << endl;
cerr << "\t-step [step size in secs]" << endl;
cerr << "\t-stiff [stiffness value]" << endl;
cerr << "\t-damp [damping value]" << endl << endl;
break;
}
}
PrintSettings();
Init();
}
Scene::~Scene(void)
{
}
void Scene::PrintSettings(void)
{
cerr << endl << "Current Settings:" << endl;
cerr << "\t-testcase " << (int)testcase << endl;
if(method==BACK_EULER)
{
cerr << "\t-method BackEuler" << endl;
}
else if(method==MIDPOINT)
{
cerr << "\t-method Midpoint" << endl;
}
else if(method==EULER)
{
cerr << "\t-method Euler" << endl;
}
else if(method==EULER_MODIF)
{
cerr << "\t-method EulerModif" << endl;
}
else
{
cerr << "\t-method ?" << endl;
}
cerr << "\t-mass " << mass << endl;
cerr << "\t-step " << step << endl;
cerr << "\t-stiff " << stiffness << endl;
cerr << "\t-damp " << damping << endl << endl;
}
void Scene::Init(void)
{
//Animation settings
pause=true;
//Create points & springs
if(testcase == SPRING1D) {
nPoints=2;
} else nPoints=3;
//Allocate vector
points.reserve(nPoints);
for(int i=0; i<nPoints; i++)
{
points.push_back(new Sphere());
}
const float pi=3.1416f;
Vec2 c(0.0f, 0.0f);
Vec2 zero(0.0f, 0.0f);
p1 = c + Vec2(0, 1);
p2 = c + Vec2(cos(210.0f/180.0f*pi), sin(210.0f/180.0f*pi));
p3 = c + Vec2(cos(330.0f/180.0f*pi), sin(330.0f/180.0f*pi));
v1 = v2 = v3 = zero;
L = (p1-p2).length();
if(testcase == SPRING1D) {
p2 = 0.5f*c;
L = (p1-p2).length();
}
points[0]->position = SbVec3f(p1[0],p1[1], 0.);
points[0]->fixed=true;
points[1]->position = SbVec3f(p2[0],p2[1], 0.);
if(nPoints > 2) {
points[2]->position = SbVec3f(p3[0],p3[1], 0.);
}
//Create spheres and transformations
spheres.reserve(nPoints);
pointXForms.reserve(nPoints);
for(int i=0; i<nPoints; i++)
{
spheres.push_back(new SoSphere());
spheres[i]->radius.setValue(0.15f/(float)xPoints);
spheres[i]->setUserData(points[i]);
pointXForms.push_back(new SoTranslation());
pointXForms[i]->translation.setValue(points[i]->position);
}
nSprings=3;
if(nPoints == 2) { nSprings=1; }
//Allocate vector
springs.reserve(nSprings);
for(int i=0; i<nSprings; i++)
{
springs.push_back(new Tube());
}
springs[0]->Initialize(points[0],points[1]);
if(nPoints>2) {
springs[1]->Initialize(points[1],points[2]);
springs[2]->Initialize(points[2],points[0]);
}
//Create cylinders and transformations
cylinders.reserve(nSprings);
springXForms.reserve(nSprings);
for(int i=0; i<nSprings; i++)
{
cylinders.push_back(new SoCylinder());
cylinders[i]->radius.setValue(0.05f/(float)xPoints);
cylinders[i]->height.setValue(springs[i]->length);
cylinders[i]->setUserData(springs[i]);
springXForms.push_back(new SoTransform());
springXForms[i]->pointAt(springs[i]->position, springs[i]->x->position);
}
}
void Scene::Update(void)
{
if(pause)
{
return;
}
//Perform animation
switch(testcase) {
case SPRING1D:
AdvanceTimeStep1(stiffness, mass, damping, L, step, method, p1[1], v1[1], p2[1], v2[1]);
break;
case HANGING:
AdvanceTimeStep2(stiffness, mass, damping, L, step, method, p1, v1, p2, v2, p3, v3);
break;
}
points[0]->position = SbVec3f(p1[0],p1[1], 0.);
points[1]->position = SbVec3f(p2[0],p2[1], 0.);
if(nPoints>2) {
points[2]->position = SbVec3f(p3[0],p3[1], 0.);
}
for(int i=0; i<nSprings; i++) springs[i]->Update();
//Update the rendering objects
for(int i=0; i<nPoints; i++)
{
//Update sphere xform based on point
pointXForms[i]->translation.setValue(points[i]->position);
}
for(int i=0; i<nSprings; i++)
{
//Update cylinder xform based on spring
springXForms[i]->pointAt(springs[i]->position, springs[i]->x->position);
//Update cylinder length
cylinders[i]->height=springs[i]->length;
}
// reduce frame rate a bit
SbTime t = SbTime::getTimeOfDay();
while(SbTime::getTimeOfDay().getValue()-t.getValue()<0.00125) {
// delay
}
}
void Scene::Add(SoSeparator *root)
{
//Add separator for moving points
SoSeparator *pointSeparator=new SoSeparator;
ro
没有合适的资源?快使用搜索试试~ 我知道了~
VS2010+OpenInventor-弹性模拟
共69个文件
tlog:30个
h:5个
obj:5个
4星 · 超过85%的资源 需积分: 9 16 下载量 125 浏览量
2012-02-08
20:47:32
上传
评论 2
收藏 3.21MB RAR 举报
温馨提示
这是一维和二维的弹性测试,包括了许多物理学的微分方程(Euler explicito, runge-kutta等)。通过在解决方案右键-属性-Debugging-command Arguments 的修改,来改变一维场景和二维场景(-testcase hanging二维),可以在Scene.h里找到相对应的代码来测试。也可以更改对应的质量,步长等物理数值来进行弹性测试。注:生成以后,按窗口红色箭头,并再次点击窗口中黑色区域然后按键盘s开始模拟。
资源推荐
资源详情
资源评论
收起资源包目录
弹性测试.rar (69个子文件)
AAPractica1a
AAPractica1a.suo 15KB
Debug
AAPractica1a.ilk 1.14MB
AAPractica1a.pdb 1.4MB
AAPractica1a.exe 170KB
ipch
aapractica1a-7b4d4ec1
aapractica1a-d07eefa7.ipch 15.38MB
AAPractica1a.sln.old 901B
_UpgradeReport_Files
UpgradeReport.xslt 12KB
UpgradeReport_Plus.gif 71B
UpgradeReport.css 3KB
UpgradeReport_Minus.gif 69B
AAPractica1a
AAPractica1a.vcproj 5KB
Debug
cl.command.1.tlog 5KB
AAPractica1a.exe.embed.manifest 406B
link.7228-cvtres.write.1.tlog 2B
Scene.obj 406KB
AAPractica1a.lastbuildstate 74B
link.6100-cvtres.read.1.tlog 2B
link.3392-cvtres.write.1.tlog 2B
Exercise.obj 125KB
Vec2.obj 11KB
rc.command.1.tlog 654B
CL.read.1.tlog 82KB
vc100.idb 1.06MB
mt.read.1.tlog 414B
link.3392.write.1.tlog 2B
link-cvtres.read.1.tlog 2B
link.read.1.tlog 5KB
link.6100-cvtres.write.1.tlog 2B
rc.read.1.tlog 386B
link.write.1.tlog 2KB
AAPractica1a.log 116B
CL.write.1.tlog 3KB
link.8824-cvtres.read.1.tlog 2B
Test.obj 99KB
LinSys.obj 19KB
vc100.pdb 548KB
link.6100.write.1.tlog 2B
AAPractica1a.exe.embed.manifest.res 472B
link.command.1.tlog 3KB
link.8824-cvtres.write.1.tlog 2B
link.6100.read.1.tlog 2B
link.8824.write.1.tlog 2B
link.3392-cvtres.read.1.tlog 2B
mt.write.1.tlog 414B
link.7228.read.1.tlog 2B
AAPractica1a.exe.intermediate.manifest 381B
mt.command.1.tlog 452B
link.3392.read.1.tlog 2B
link.7228-cvtres.read.1.tlog 2B
link.7228.write.1.tlog 2B
rc.write.1.tlog 394B
link-cvtres.write.1.tlog 2B
link.8824.read.1.tlog 2B
AAPractica1a_manifest.rc 214B
Vec2.h 3KB
AAPractica1a.vcxproj.filters 2KB
Exercise.cpp 10KB
LinSys.cpp 4KB
Scene.h 2KB
Exercise.h 301B
LinSys.h 3KB
Test.cpp 2KB
Primitives.h 561B
Vec2.cpp 161B
AAPractica1a.vcxproj 6KB
AAPractica1a.vcxproj.user 403B
Scene.cpp 10KB
UpgradeLog.XML 3KB
AAPractica1a.sln 903B
共 69 条
- 1
资源评论
- vbscripzt2016-05-10好好学习一下。紫薯补丁
- qq_296186032015-09-11是教程,不是软件、qaq
zhoubb628
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功