3 Babylonjs基础入门 设置位置、旋转和缩放

坐标轴

在讲这篇之前,我们应该先了解一下坐标轴的含义。大家经常看到的坐标轴是2d坐标轴,就是定义了一个原点,横向x轴,纵向y轴。而在3d坐标系内,我们需要增加第三个轴Z轴。之前了解过Three.js的朋友应该知道,Three.js是使用的右手坐标系,向右方向为X轴正方向,向上为Y轴正方向,指向屏幕的方向为Z轴正方向。而Babylonjs使用的坐标系是左手坐标系,刚好和Three.js 的Z轴正方向相反。(对着理论还不理解的大家可以查一下左手坐标系和右手坐标系)

在所有图表和场景中,X轴为红色,Y轴为绿色,Z轴为蓝色。
坐标系分为世界坐标和局部坐标。世界坐标的原点是恒定不变的,局部坐标是通过转换出来的单独的坐标系。

向量

在Babylonjs中,我们需要通过 new BABYLON.Vector3(x, y, z)的对象来表示模型网格的位置、旋转以及缩放。

默认位置

所有的模型在创建之后,它们的默认位置都是出于世界坐标原点,所有轴的旋转为0,缩放为1

设置位置

我们可以一次性设置模型网格所有轴的位置:

pilot.position = new BABYLON.Vector3(2, 3, 4);

或者对单个轴的坐标设置

pilot.position.x  =  2;
pilot.position.y  =  3;
pilot.position.z  =  4;

设置旋转

我们可以一次性设置沿所有轴的旋转

pilot.rotation = new BABYLON.Vector3(alpha, beta, gamma);

或者单独设置沿某个轴旋转:

pilot.rotation.x  =  alpha; //沿着X轴旋转
pilot.rotation.y  =  beta;  //沿着Y轴旋转
pilot.rotation.z  =  gamma; //沿着Z轴旋转

以上三个轴的旋转书写顺序没有先后,无论怎么设置,模型旋转在世界坐标系都是按ZYX顺序旋转。
其中alpha,beta和gamma是以弧度为单位测量的角度。即2π为沿当前旋转轴旋转一周360度的值。

自定义顺序旋转

现在问题来了,Babylongjs旋转顺序是固定的,如果你想自已定义自己的渲染顺序,可以使用网格方法addRotation。
比如,如果你想先沿X轴旋转,再沿Y轴旋转,最后进行Z轴旋转:

mesh.addRotation(Math.PI/2, 0, 0).addRotation(0, Math.PI/2, 0).addRotation(0, 0, Math.PI/2);

设置缩放

模型网格默认缩放都为1,就是不缩放。缩放值不能小于等于0,小于1将比默认尺寸缩小,大于1将按倍数缩放。
我们可以通过实例化一个三维向量进行设置所有轴的缩放:

mesh.scaling = new BABYLON.Vector3(scale_x, scale_y, scale_z);

或者单独定义某个轴的缩放:

mesh.scaling.x = 5;
mesh.scaling.y = 5;
mesh.scaling.z = 5;

上面我们设置了网格模型沿三个轴都放大到了默认的五倍尺寸。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Unity中,可以通过Transform组件来调整游戏对象的位置旋转缩放。Transform组件是所有游戏对象都具有的组件,可以通过代码或Inspector面板对其进行修改。 下面是一些常用的Transform属性和方法: 1. Position属性:控制游戏对象在世界空间中的位置。可以直接修改Position属性的x、y、z值,也可以使用Vector3类型的变量来设置。 ```csharp // 将游戏对象的位置移动到(0, 1, 0)的位置 transform.position = new Vector3(0, 1, 0); ``` 2. Rotation属性:控制游戏对象在世界空间中的旋转角度。可以直接修改Rotation属性的x、y、z值,也可以使用Quaternion类型的变量来设置。 ```csharp // 将游戏对象绕y轴旋转90度 transform.rotation = Quaternion.Euler(0, 90, 0); ``` 3. Scale属性:控制游戏对象的缩放比例。可以直接修改Scale属性的x、y、z值,也可以使用Vector3类型的变量来设置。 ```csharp // 将游戏对象的缩放比例设置为(2, 2, 2) transform.localScale = new Vector3(2, 2, 2); ``` 4. Translate()方法:在游戏对象的当前位置移动一定的距离。Translate()方法接受一个Vector3类型的参数,表示移动的距离和方向。 ```csharp // 将游戏对象向前移动1个单位 transform.Translate(Vector3.forward); ``` 5. Rotate()方法:在游戏对象的当前旋转角度上旋转一定的角度。Rotate()方法接受一个Vector3类型的参数,表示绕x、y、z轴旋转的角度。 ```csharp // 将游戏对象绕y轴旋转90度 transform.Rotate(Vector3.up * 90); ``` 6. Scale()方法:在游戏对象的当前缩放比例上缩放一定的比例。Scale()方法接受一个Vector3类型的参数,表示在x、y、z轴上的缩放比例。 ```csharp // 将游戏对象在x轴上缩放2倍 transform.localScale = new Vector3(2, 1, 1); ``` 需要注意的是,Transform组件的修改会影响到游戏对象的所有子对象。如果只想修改某个子对象的Transform属性,可以使用该子对象的Transform组件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值