【综合|无类|待修】 [缺封面] unity旋转缩放
发布于
2022-8-3
70
32

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 胖纸_DHW 于 2019-10-18 21:44 编辑

最近做了个物体的旋转缩放的例子,写写算法。

给需要旋转缩放的物体加上脚本:RotateAndZoom。

旋转物体采用操作物体的transform(变换)部件来实现,改变transform的rotation(世界空间坐标物体变换的旋转角度)或者localRotation(自身旋转角度)就会产生旋转效果。

在Update函数里,检测到鼠标按下拖动时就通过Input.GetAxlis方法获取鼠标在x轴和y轴方向的改变量,然后使用Quaternion.Euler构建一个表示旋转Quaternion(四元数)然后赋给模型对象的transform(变换)的rotation属性就可以产生相应的旋转。

对于模型的缩放,采用的是改变摄像机与模型的距离来产生缩放效果。通过Input接口获取鼠标滚轮的滚动值,相应的改变摄像机与模型的距离就可以了。

旋转是用两个变量x,y来保存其在x轴和y轴的旋转角度,每帧都用x,y表示的旋转量赋给模型,这样只要x,y一改变模型就会马上有旋转变化。在鼠标拖动时,获取鼠标在x轴和y轴的变量(根据拖动方向有正负之分)并乘以灵敏度后叠加到变量x,y,就可以使模型旋转。

代码:

var xSpeed:float = 25.0;//水平转动灵敏度
var ySpeed:float = 12.0;//垂直转动灵敏度
var rSpeed:float = 30.0;//转动动画速度
var yMinLimit:float = -360;//垂直转动最小角度限制
var yMaxLimit:float = 360;//垂直转动最大角度限制
var initDis:float = 0;//摄像机初始距离
var minDis:float = 2.0;//摄像机与物体最小距离限制
var maxDis:float = 10.0;//摄像机与物体最大距离限制
var wheelSpeed:float = 10;//鼠标滚动缩放灵敏度
var roable:boolean = true;//开始是否自动转动
private var x:float = 0.0;//保存y轴旋转速度
private var y:float = 0.0;//保存x轴旋转速度
private var distance:float;//保存摄像机距离
private var rotation;
var damper:float=4;//阻尼系数
var useDamper:boolean;//是否对旋转缩放操作使用阻尼器
//private var scrollAngle:float = 0.0f;

//初始化
function Start(){

distance = initDis;
rotation = Quaternion.Euler(y,x,0);
if(rigidbody){
rigidbody.freezeRotation = true;//使物理行为不可改变物体的旋转
}
}

function Update(){
//var mainCamera = FindCamera();
if(roable && Input.anyKey){
//当有操作时,停止模型初始的自动旋转
roable = false;
}
if(roable){
//自动旋转
x-=Time.deltaTime*rSpeed;
rotation = Quaternion.Euler(y,x,0);
}else{
var hit:RaycastHit;
Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),hit,100);
//如果鼠标点击对象是刚体Kinematic为True就忽略
if(hit.rigidbody && !hit.rigidbody.isKinematic)

return;
if(Input.GetMouseButton(0)){
// 当按住鼠标左键时
var dx:float = Input.GetAxis("Mouse X") * xSpeed;
var dy:float = Input.GetAxis("Mouse Y") * ySpeed;
//排除一帧内过大角度的旋转
if(Mathf.Abs(dx) x -= dx;
y += dy;
y = ClampAngle(y,yMinLimit,yMaxLimit);//控制旋转范围
rotation = Quaternion.Euler(y,x,0);//构建表示旋转的四元数
}
}
if(useDamper){
//使用现有旋转和目标旋转进行插值作为旋转结果,这可使旋转效果变得平滑
transform.rotation = Quaternion.Lerp(transform.rotation,rotation,Time.deltaTime*damper);
}else{
transform.rotation = rotation;
}
}

}

function LateUpdate(){
distance -= Input.GetAxis("Mouse ScrollWheel")*wheelSpeed;//获取鼠标中建响应
distance = Mathf.Clamp(distance,minDis,maxDis);//控制距离在最大值和最小值之间
if(useDamper){
//使用现有摄像机距离和目标距离进行差值作为摄像机的距离,这可使缩放效果变得【平滑
Camera.main.transform.position.z = Mathf.Lerp(Camera.main.transform.position.z,-distance,Time.deltaTime*damper);
}else{
Camera.main.transform.position.z = -distance;
}

}

static function ClampAngle(angle:float,min:float,max:float){
//把角度限制在min和max之间
if(angle < -360) angle+=360; if(angle > 360) angle-=360;
return Mathf.Clamp(angle,min,max);
}

function FindCamera ()
{
if (camera)
return camera;
else
return Camera.main;
}
参与人数 1 活跃度 -1
还没有设置签名!您可以在此展示你的链接,或者个人主页!

使用道具 举报 登录

回复 <
请喊我歪哥  发表于 2014-10-11 10:54:50  
3#
学习了
回复 收起回复
使用道具
真的是神仙  发表于 2014-11-13 09:53:55  
4#
666666
回复 收起回复
使用道具
kopf2014  发表于 2014-11-13 11:39:55  
5#
不懂程序,杯具
回复 收起回复
使用道具
卟、耐烦  发表于 2014-11-13 13:57:24  
6#
谢谢分享
回复 收起回复
使用道具
jasoncool  发表于 2014-11-16 21:21:45  
7#
来学习了
回复 收起回复
使用道具
hxsd  发表于 2014-11-16 23:47:01  
8#
Unity的官方画廊
回复 收起回复
使用道具
Micky-D700  发表于 2015-9-16 20:33:31  
9#
{:1_144:}
回复 收起回复
使用道具
maoyaohau123  发表于 2015-10-10 13:07:08  
10#
给力!元素有你更精彩
回复 收起回复
使用道具
folishman  发表于 2015-10-11 13:02:19  
11#
不错很好很强大
回复 收起回复
使用道具
mike_meng  发表于 2015-10-19 21:24:37  
12#
正是本尊想要的!
回复 收起回复
使用道具
狂奔de蜗牛  发表于 2018-11-12 09:45:10  
13#
谢谢分享~!支持
回复 收起回复
使用道具
vitamins  发表于 2018-11-12 10:05:29  
14#
资源甚好,发帖艰辛,且阅且珍惜!
回复 收起回复
使用道具
飞~  发表于 2018-11-12 10:07:50  
15#
赞一个~666
回复 收起回复
使用道具
idhjzhzw  发表于 2018-11-12 10:10:45  
16#
谢谢分享
回复 收起回复
使用道具
madmonkey  发表于 2018-11-12 10:12:01  
17#
不错的资源,谢谢分享
回复 收起回复
使用道具
@LD  发表于 2018-11-12 10:12:50  
18#
路过围观,感谢分享~
回复 收起回复
使用道具
发贺卡  发表于 2018-11-12 10:18:45  
19#
学习了
回复 收起回复
使用道具
yeshenliu  发表于 2018-11-12 10:19:26  
20#

不错的资源,谢谢分享
回复 收起回复
使用道具
12下一页

快来发表你宝贵的意见吧!

_娱乐无罪 实名

通过了实名认证的内容创造者

  

主题
29
精华
1
超神
0
扩散
0
微金
0
智慧
0
余额
0
在线时间
602 小时

【绝】结界玄晶 神界之石 血精之钻 元素铜币 元素银币 元素金币 长剑 长枪 火元素

快速回复 返回顶部 返回列表