用户:
迷失冷光查看:49 回复:57 评论:49 创建时间:2021-11-13T12:12:59
——————————————————————————————————————————————————
——————————————————————————————————————————————————
——————————————————————————————————————————————————
今天我们来讲讲三角函数
看图:

这是一个圆
可见向右是0°

此图中我们要求深蓝色线的长度
半径为1
浅蓝色与蓝色线之间的夹角是90°
那么深蓝色线=π/2
=1/2π
再看下图

这是蓝色线长度是上一幅图的2倍
所以蓝色线的长度是2*1/2π=π
再看

此图中蓝色线又是上一幅图的两倍
那么就再乘2:2*π=2π
我们得到了一个计算角度的方法
1/2π就是90°
π就是180°
2π就是360°
假设a=30°
用刚才的表示方法就是a=30/360*2π
那么

我们就获得了一个点
假设红点的位置是(0,0)
x坐标是0,y坐标也是0
上面有一条紫色的线和一条粉色的线
它们交汇的部分我们称之为b
那么b点也有其x坐标和y坐标
b点的x坐标是粉色线的长度
b点的y坐标是紫色线的长度
那么如何确定坐标呢?(要求背诵)
粉色线的长度是Math.cos(a)
紫色线的长度是Math.sin(a)
//a是一个模型
//b也是一个模型
b.position.y = a.position.y;
world.onTick(({tick})=>{
b.position.x = a.position.x + Math.cos(tick * 旋转速度);
b.position.z = a.position.z + Math.sin(tick * 旋转速度);
})
a是角度
举个例子
让模型a围绕着模型b旋转
运行一下代码
有人会觉得b模型靠a模型太近了
那么再看

此图中绿色线是粉色线长度的2倍
深红色线是紫色线长度的2倍
浅蓝色线仍然指着绿色线与深红色线的交汇点
大圆的半径是2
所以如果要让旋转距离加大的话
b.position.y = a.position.y;
world.onTick(({tick})=>{
b.position.x = a.position.x + Math.cos(tick * 旋转速度) * 旋转半径;
b.position.z = a.position.z + Math.sin(tick * 旋转速度) * 旋转半径;
})
现在我们已经搞懂二维旋转的原理了
下面看三维
以下内容高危,萌新勿入
如何表达球上一点

这是一个球(画的有点喵)
假设此球的半径是1
那么

这就像一个地球了
红色是纬线,蓝色是经线(甚)

这个球上红线是angle(角度)
蓝线是up(仰角)
绿点位置是(0,0,0)
x坐标y坐标z坐标都是0
黄色点的角度是红线的角度,仰角是蓝线的仰角
我们先来处理蓝线:
蓝色线的sin值是黄色点的y坐标
如
y = Math.sin(up)
然后蓝色线的cos值是球的半径
如
radius = Math.cos(up)
再来处理红色线:
与上文处理二维方法相似
x = Math.cos(angle)
z = Math.sin(angle)
但这是会发现如果仰角距离0°或180°较远时
黄点会不在球上
所以x、y值要乘上radius
x = Math.cos(angle) * radius;
z = Math.sin(angle) * radius;
如果发现总体距喵点太近
就需要再乘上一个radius
我们封装成一个函数
function point_in_ball(origin,angle,up,radius){
return new Box3Vector3(
origin.x + Math.cos(angle) * Math.cos(up) * radius,
origin.y + Math.sin(up) * radius,
origin.z + Math.sin(angle) * Math.cos(up) * radius
)
}
然后我们说一下反求
这里就不讲解了
atan2功能就是这样
大家背诵就好了
二维:
angle = Math.atan2(y,x);
三维:
up = Math.atan2(y,Math.sqrt(x**2+z**2));
angle = Math.atan2(z,x);
上面出现的代码都是JS的
所以可以拿到编辑服里用
星辰Lolitafunction point_in_ball(origin,angle,up,radius){
return new Box3Vector3(
origin.x + Math.cos(angle) * Math.cos(up) * radius,
origin.y + Math.sin(up) * radius,
origin.z + Math.sin(angle) * Math.cos(up) * radius
)
}
白嫖了
点赞0
评论
阳光猫牛掰imgsrc="https://static.codemao.cn/emoji/codemao/%E7%BC%96%E7%A8%8B%E7%8C%AB_%E5%8E%89%E5%AE%B3%E4%BA%86.gif"alt="emotion_编程猫_厉害了"
点赞0
评论