unity3d引擎是如何来驱动三维模型,最终生成仿真系统的

unity3d引擎是如何来驱动三维模型,最终生成仿真系统的,第1张

首先,要在模型里拖进去Assembly(就是平面库里第一个那个圆形)。建模注意:你的机构构件的连接点数以跟其它构件连接点数为准,可以多,但是不能少。多的可以加 zero force source 填上占位。铰接点无驱动时用 pivot junction 有驱动用 pilot pivot junction。平动副用 translation junction、pilot translation junction,如果用jack可以直接代表油缸加两端的铰接点。构件参数设置时最好以构件坐标原点(X,Y)=(0,0)为一个铰接点向外推,多出铰接点的空位可以用zero force source 填上占位并设置数值来标识构件的轮廓外形。三维模型的导入,要在参数设置模式下双击Assembly图标进入三维显示界面。并在三维显示界面导入。导入格式有几种,我为了跟SimulationX通用一般用STL格式。STL可以用三维制图软件导出,导出时最好将输出坐标原点设置在铰接点处,这样在模型里调整时方便。导入命令在三维显示模式的creat->3D model中选取。导入时要先在object树中点击选取三维模型要关联的构件。object树在三维显示界面的最左边那排按钮右侧紧贴着一个左右拉动的框,向右拉就可以看到object树了。跟在proe里那种显示方法一样。点选树中的构件并有显示选中后再导入模型就可以关联了,不然导入的三维模型会在总树下面,不会跟任何构件运动,成了仿真的背景图像。导入的三维模型不一定能够跟构件的角度、方向吻合,可以在object树中设置转动方向、角度、颜色等等。最后,AMEsim对构件的计算支持并不好,加了构件的液压模型计算经常报错。效率并不高。曾经有Adams联合仿真的模型,去掉接口用平面机构库建模。原来联仿只要2+小时的计算最后花了29小时+,而且最大的缺点是只能做平面机构。相比而言如果想在一个软件里实现控制和机械联合我推荐用SimulationX, *** 作基本类似,但是Modelica语言对机械结构的支持要明显好于AMEsim,(但是液压系统的支持要弱些。。。) 总之只要你有条件,高精度的联合仿真才好。 最好是AMEsim和VirtualLabMotion的(一个公司,软件配合上有优化)。 VirtualLabMotion的 *** 作不太常规,资料也少。上手快的话还是AMEsim+Adams好些,国内资料丰富,可以指导的高手也很多。 但是如果做履带,还是花点功夫学学VirtualLabMotion。Adams的计算履带的时间会让你感觉时间真是个宝贵。

 1Android端代码可以在Eclipse中开发(AndroidStudio没有试,应该也可以)

2Unity3D端代码要在Unity中开发

3Android和Unity3D端,两边都需要加入一些代码从而可以使之关联交互。

4将Android端代码编译成jar文件以插件形式放入到Unity端中

5在Unity中将整个项目Build成apk文件,然后安装到手机或模拟器里运行

本文主要讲解1,2,3。对于4,5建议大家去看雨松MOMO的Unity博客的第17篇和第18篇。

UnityPlay:

在编写Android端和Unity3d端代码前,有必要先了解一下可以使两部分交互的类UnityPlay。

个人理解UnityPlay是个Unity提供给外部交互的一个接口类。

为什么是“个人理解”?这我不得不爆粗口了,TMD官网根本就没有相关的API和文档(如果大家有谁找到一定给我来一份,就当我骂自己了)。

在关联Android时,想拿到UnityPlay以及相关类的jar包可以从下面的地址找到:Unity安装路径\Editor\Data\PlaybackEngines\androidplayer\bin在bin文件夹下有一个classesjar的jar文件,它就是我们想要的。

而在bin同目录下有一个src文件,点击到最后有3个类,分别是UnityPlayerActivityjava,UnityPlayerProxyActivityjava,UnityPlayerNativeActivityjava。前两个打开个后只有一行代码,说的是UnityPlayerActivity和UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity。而打开UnityPlayerNativeActivity中居然有代码,而且我估计这应该是UnityPlayerNativeActivity的源码。

由于关于UnityPlay的资料我只找到这么一个,所以我把UnityPlayerNativeActivity中的代码都贴出来,如果我注解有不对的地方希望大家指正。

/

UnityPlayerActivity,UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity

而UnityPlayerNativeActivity继承自NativeActivity

在该类里定义了一些和ANDROID生命周期相同的回调方法,留给自定义的Activity子类重写。

/

public class UnityPlayerNativeActivity extends NativeActivity

{

//UnityPlayer的引用,并且我们不能改变这个引用变量的名字,它被native code所引用

protected UnityPlayer mUnityPlayer;

protected void onCreate (Bundle savedInstanceState)

{

requestWindowFeature(WindowFEATURE_NO_TITLE);

superonCreate(savedInstanceState);

// 设置显示窗口参数

getWindow()takeSurface(null);

setTheme(androidRstyleTheme_NoTitleBar_Fullscreen);

getWindow()setFormat(PixelFormatRGB_565);

// 创建一个UnityPlayer对象,并赋值给全局的引用变量

mUnityPlayer = new UnityPlayer(this);

//为UnityPlayer设置一些参数

if (mUnityPlayergetSettings ()getBoolean ("hide_status_bar", true))

getWindow ()setFlags (WindowManagerLayoutParamsFLAG_FULLSCREEN,

WindowManagerLayoutParamsFLAG_FULLSCREEN);

int glesMode = mUnityPlayergetSettings()getInt("gles_mode", 1);

boolean trueColor8888 = false;

// UnityPlayerinit()方法需要在将view附加到layout之前调用。它将会调用native code

mUnityPlayerinit(glesMode, trueColor8888);

// 从UnityPlayer中获取到Unity的View视图

View playerView = mUnityPlayergetView();

// 将Unity视图加载到根视图上

setContentView(playerView);

// 使Unity视图获取焦点

playerViewrequestFocus();

}

protected void onDestroy ()

{

// 当Activity结束的时候调用UnityPlayerquit()方法,它会卸载之前调用的native code

mUnityPlayerquit();

superonDestroy();

}

// 下面几个方法都是ANDROID相关回调方法,确保在ANDROID执行相应方法时UnityPlayer也需调用相应方法

protected void onPause()

{

superonPause();

mUnityPlayerpause();

}

protected void onResume()

{

superonResume();

mUnityPlayerresume();

}

public void onConfigurationChanged(Configuration newConfig)

{

superonConfigurationChanged(newConfig);

mUnityPlayerconfigurationChanged(newConfig);

}

public void onWindowFocusChanged(boolean hasFocus)

{

superonWindowFocusChanged(hasFocus);

mUnityPlayerwindowFocusChanged(hasFocus);

}

public boolean dispatchKeyEvent(KeyEvent event)

{

if (eventgetAction() == KeyEventACTION_MULTIPLE)

return mUnityPlayeronKeyMultiple(eventgetKeyCode(), eventgetRepeatCount(), event);

return superdispatchKeyEvent(event);

}

}

看完这个类后就知道了为什么在自定义的Activity中继承了UnityPlayerActivity等类以后,只要重写了onCreate并调用superonCreate()方法后不需要任何其他的代码就会自动的显示出Unity3D的视图。因为初始化Unity视图的代码都在UnityPlayerNativeActivity父类中实现了。

ANDROID端代码:

在写ANDROID代码的时候,一定要导入Unity3D提供给我们的jar包,jar包的位置我在上面说了。引入jar包加入到buildpath中这些最基本的我就不多说了。

要想和Unity交互,我们就不能继承ANDROID提供给我们的Activity,我们需要继承刚才jar包中引入的Unity提供的Activity类,一共有这么3个:

UnityPlayerActivity,UnityPlayerProxyActivity,UnityPlayerNativeActivity。具体区别不知道,因为没有文档,没有API,没有源码(这里再次鄙视一下)。刚才我们看过UnityPlayerNativeActivity的代码(虽然很短,但我觉得这个就是源码),知道UnityPlayerActivity,UnityPlayerProxyActivity都是它的子类,而且最终父类为NativeActivity。所以我们继承Unity提供的最外层的子类是最好的选择,我这里选择的是UnityPlayerActivity,因为名字最简单,觉得该封装的都应该封装好了。

public class MainActivity extends UnityPlayerActivity {

private Button topButton;

private Button bottomButton;

@Override

protected void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

// 设置test为我们的根布局

setContentView(Rlayouttest);

// 通过刚才的源码分析,知道mUnityPlayer为一个全局的引用变量,而且已经在父类中设置好了,所以直接拿来用就可以了

View playerView = mUnityPlayergetView();

// 将Unity的视图添加到我们为其准备的父容器中

LinearLayout ll = (LinearLayout) findViewById(RidunityViewLyaout);

lladdView(playerView);

// 上面的button设置监听器

topButton = (Button) findViewById(RidtopButton);

topButtonsetOnClickListener(new ViewOnClickListener() {

@Override

public void onClick(View v) {

//发送消息给Unity端,该函数第一个参数为接受消息的类对象,第二个该类对象用接受消息的方法,第三个参数为传递的消息

//所以下面的意思就为:调用Main Camera下面的Previous方法,传送的消息为空

UnityPlayerUnitySendMessage("Main Camera","Previous","");

}

});

// 为下面的button设置监听器

bottomButton = (Button) findViewById(RidbottomBtn);

bottomButtonsetOnClickListener(new ViewOnClickListener() {

@Override

public void onClick(View v) {

//调用Main Camera下面的Next方法,传送的消息为空

UnityPlayerUnitySendMessage("Main Camera","Next","");

}

});

}

}

最后看一下Android端的布局文件,布局很简单,上下各有一个button按钮,两个按钮中间是Unity的视图。

<xml version="10" encoding="utf-8">

<RelativeLayout xmlns:android=">

以下是一些常用的3D建模软件:

Blender:免费、开源、跨平台,功能强大且易于学习。

Autodesk 3ds Max:强大的建模和渲染工具,主要面向游戏、影视等行业。

Autodesk Maya:另一款强大的建模和动画软件,广泛应用于影视和动画制作领域。

Cinema 4D:专注于运动图形和特效方面的建模软件,易于使用且效果出色。

ZBrush:主要用于数字雕刻和纹理绘制,适合需要高精度的人物和生物建模。

以上是我所知道的一些常用的3D建模软件,你可以根据自己的需求选择适合自己的。

以上就是关于unity3d引擎是如何来驱动三维模型,最终生成仿真系统的全部的内容,包括:unity3d引擎是如何来驱动三维模型,最终生成仿真系统的、如何将unity模型导入android程序中、有什么好的3D建模软件推荐吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9837649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存