3、对模型的移动,缩放,以及旋转

1、要对模型的移动,缩放和旋转,要使用osg::Matrix对象中的translate()(移动),scale()(缩放),rotate()(旋转),那么要使用这些还必须有osg::MatrixTransform对象作为基础,此对象是对模型的位置进行管理的,可通过setMatrix()函数进行设置位置,以及通过addChild()添加模型,最后都加入到Group对象中,如以下代码是移动:

osg::ref_ptr<osg::MatrixTransform> trans=new osg::MatrixTransform();
trans->setMatrix(osg::Matrix::translate(0,0,2));//坐标轴是向左右是x轴(右正,左负),上下是z轴(上正,下负),向里向外是y轴(里正,外负)
trans->addChild(osgcool.get());					//从中心坐标向上移动2个单位
2、对模型同时缩放和移动,只需要相乘即可,如下一代码所示:

osg::ref_ptr<osg::MatrixTransform> scale=new osg::MatrixTransform();
scale->setMatrix(osg::Matrix::scale(0.5,0.5,0.5)*osg::Matrix::translate(0,0,-2));//向上移动2个单位,并且对其缩小整体0.5倍
scale->addChild(osgcool.get());													//移动和缩放相乘就是对模型的移动和缩放同时进行
3、对模型旋转45度可使用以下代码:

osg::ref_ptr<osg::MatrixTransform> rot=new osg::MatrixTransform();
rot->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(45.0),1,0,0)*osg::Matrix::scale(0.5,0.5,0.5)*osg::Matrix::translate(4,0,-2));
rot->addChild(osgcool.get());	//模型向下移动两个单位,向右移动四个单位,并且整体缩放0.5倍,且绕X轴转45度,
									//其中osg::DegreesToRadians(45.0),1,0,0)是将度数转为弧度,对于rotate,中的1表示延x轴旋转,如果是-1则表示逆时旋转
4、然后将所有的MatrixTransform对象添加到Group中,如下代码所示:

root->addChild(osgcool.get());//在中间
root->addChild(trans.get());//在原点的上方
root->addChild(scale.get());//在原点的下方
root->addChild(rot.get());
最后的代码如下所示:

#include "stdafx.h"
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/MatrixTransform>
#include <osg/Matrix>
int _tmain(int argc, _TCHAR* argv[])
{
	osgViewer::Viewer viewer;
	osg::ref_ptr<osg::Group> root=new osg::Group();
	osg::ref_ptr<osg::Switch> sw=new osg::Switch();
	osg::ref_ptr<osg::Node> osgcool=osgDB::readNodeFile("osgcool.osgt");
	osg::ref_ptr<osg::MatrixTransform> trans=new osg::MatrixTransform();
	trans->setMatrix(osg::Matrix::translate(0,0,2));//坐标轴是向左右是x轴(右正,左负),上下是z轴(上正,下负),向里向外是y轴(里正,外负)
	trans->addChild(osgcool.get());					//从中心坐标向上移动2个单位

	osg::ref_ptr<osg::MatrixTransform> scale=new osg::MatrixTransform();
	scale->setMatrix(osg::Matrix::scale(0.5,0.5,0.5)*osg::Matrix::translate(0,0,-2));//向上移动2个单位,并且对其缩小整体0.5倍
	scale->addChild(osgcool.get());													//移动和缩放相乘就是对模型的移动和缩放同时进行

	osg::ref_ptr<osg::MatrixTransform> rot=new osg::MatrixTransform();
	rot->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(45.0),1,0,0)*osg::Matrix::scale(0.5,0.5,0.5)*osg::Matrix::translate(4,0,-2));
	rot->addChild(osgcool.get());	//模型向下移动两个单位,向右移动四个单位,并且整体缩放0.5倍,且绕X轴转45度,
									//其中osg::DegreesToRadians(45.0),1,0,0)是将度数转为弧度,对于rotate,中的1表示延x轴旋转,如果是-1则表示逆时旋转

	root->addChild(osgcool.get());//在中间
	root->addChild(trans.get());//在原点的上方
	root->addChild(scale.get());//在原点的下方
	root->addChild(rot.get());
	viewer.setSceneData(root.get());
	viewer.realize();
	return viewer.run();
}

运行效果如下:






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity是一种强大的游戏引擎,可以轻松实现触屏缩放移动旋转模型的功能。下面是简单说明如何实现这些操作: 1. 触屏缩放:要实现触屏缩放,可以使用Unity内置的Touch类。首先在游戏场景中添加一个脚本,然后在Update函数中检测触摸的数量。如果有两个触点,可以使用两个触点之间的距离变化来作为缩放因子。根据这个缩放因子来调整模型的大小。 2. 触屏移动:要实现触屏移动,可以使用Touch类的deltaPosition属性来获取触点的移动向量。通过将这个移动向量添加到模型的位置上,模型就会跟随触点的移动移动。需要注意的是,触屏移动只会影响模型的位置,不会改变模型旋转。 3. 触屏旋转:要实现触屏旋转,可以使用Touch类中的deltaRotation属性来获取触点的旋转变化。与移动类似,将旋转变化应用到模型旋转上即可实现触屏旋转功能。需要注意的是,触屏旋转只会影响模型旋转,不会改变模型的位置。 上述三种功能可以组合使用,以实现更灵活的交互效果。同时,还可以通过适当的限制和优化,来避免误操作和提升用户体验。 ### 回答2: 在Unity中,我们可以通过使用触屏手势来实现模型缩放移动旋转。 要实现模型缩放功能,我们可以使用"Pinch"手势。通过在手机屏幕上的两个手指间进行收缩或展开的操作,可以实现模型缩放效果。我们可以在Unity中编写代码来检测这个手势,并根据手指的移动距离来调整模型的大小。 要实现模型移动功能,我们可以使用"Drag"手势。通过在屏幕上拖动手指来移动模型。在Unity中,我们可以编写代码来检测此手势,并根据手指的移动距离和方向来调整模型的位置。 要实现模型旋转功能,我们可以使用"Rotate"手势。通过在屏幕上旋转手指来旋转模型。在Unity中,我们可以编写代码来检测此手势,并根据手指的旋转角度和方向来调整模型旋转角度。 总结来说,通过使用Unity的触屏手势功能,我们可以实现模型缩放移动旋转。这些功能可以给游戏开发带来更多的交互性和用户体验。 ### 回答3: Unity是一种游戏引擎,它提供了许多内置的功能和工具,可以轻松地实现触屏缩放移动旋转模型的效果。 首先,要实现触屏缩放模型,可以利用Unity的Input类和Touch类来实现。我们可以检测到触摸屏幕的手势,例如双指捏合手势。通过获取触摸点的位置和上一帧的位置之间的距离差,可以根据这个差值来缩放模型。 其次,要实现触屏移动模型,可以使用Unity的Transform组件来控制模型的位置。通过检测到触摸屏幕的手势,例如单指滑动手势,我们可以获取到滑动的方向和距离,然后通过改变模型的位置来实现移动效果。 最后,要实现触屏旋转模型,也可以利用Unity的Transform组件来实现。同样地,通过检测到触摸屏幕的手势,例如双指旋转手势,我们可以获取到旋转的角度和方向,然后通过改变模型旋转角度来实现旋转效果。 总之,Unity提供了强大的功能和工具,可以方便地实现触屏缩放移动旋转模型的效果。开发者只需使用相应的API来获取触摸输入,并利用这些输入来操作模型的位置、缩放旋转即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值