开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[BE教程] 平移平面上的点到其他平面

 发表于 2024-11-2 04:02:30 来自手机|显示全部楼层|阅读模式 IP:安徽省
前情回顾
xz/xy/zy平面点移动至其他平面
https://klpbbs.com/thread-147984-1-1.html

其实那里面说的方法,我自己都不用,因为这个方法有个严重的缺陷,就是新基底的y方向不确定,其次就是拿向量描述平面太抽象了,给我两个向量一版也想象不出来他到底在哪个平面

这次会介绍一个更加直观的方法
结尾会附上JavaScript代码
首先要说一个高中不会提的东西(你们高中提吗)
极坐标系
在三维空间中,他是以两个角和一个数字去描述向量的
这里记作(st1,st2,mod)
首先假想有一个底面,和一个原点,st1就表示相对这个底面逆时针旋转的角度,st2就表示相对这个底面在竖直方向的旋转角度,mod就是向量的模长
(表述不是很好,实在听不懂去查资料)
他和笛卡尔坐标系的转换关系为
x:mod*sin(st2)cos(st1)
y:mod*sin(st2)sin(st1)
z:mod*cos(st2)
当你理解极坐标系这两个角代表什么的时候,就可以来平移点到其他平面了
对于最基础的这个平面,想要得到其他平面最多只需要三个操作,水平方向上旋转一定角度,竖直方向上旋转一定角度,原点动一下
这里我们先考虑前两个操作

对于前两个操作,旋转的角度会直接加到极坐标系坐标上,即操作完后新坐标在极坐标系下为(st1+水平角,st2+竖直角,mod)
然后再配合我们高中学的两角和和差公式,就可以得到一个新的坐标,对基础平面上的每一个点的坐标进行相同的运算,最后再加上两个平面原点的差
得到的新点就在目标平面上,且相对远点和正方向不会有任何改变
JavaScript代码,参数1:点坐标;2:水平旋转角;3:竖直旋转角(均为弧度制)
function rotationAngle(Vector,RotationAngleBottomSurface,RotationAngleVerticalaPlane){
const {sin,cos,sqrt} = Math
const {x,y,z} = Vector
const len = sqrt(x*x+y*y)
const length = sqrt(x*x+y*y+z*z)
const cv = x / len
const sv = y / len
const czv = z / length
const szv = sqrt(1 - czv**2)
const sr = sin(RotationAngleBottomSurface)
const cr = cos(RotationAngleBottomSurface)
const szr = sin(RotationAngleVerticalaPlane)
const czr = cos(RotationAngleVerticalaPlane)
const k = sqrt(1 - (czv*czr - szv*szr)**2)
return {
x:k*length*(cv*cr - sv*sr),
y:k*length*(cr*sv + cv*sr),
z:length*(czv*czr - szv*szr) * -1,
}
}

苦力怕论坛,感谢有您~
 楼主|  发表于 2024-11-2 12:18:16 来自手机|显示全部楼层 IP:安徽省
我搞错了,但是代码对了
点击链接查看和 Kimi 智能助手的对话 https://kimi.moonshot.cn/share/csiqdtr4ukfbg1i8v5og
2#2024-11-2 12:18:16回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

粤公网安备 44200002445329号 | 由 木韩网络 提供支持 | GMT+8, 2024-11-24 10:42

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4 粤ICP备2023071842号-3