用户:
阳光的流熔怪Uyt5查看:285 回复:13 评论:6 创建时间:2021-08-21T19:07:13
function jvli(x, y, z, x1, y1, z1) { //只计算xz轴距离 因为绕y轴旋转时转动半径和y坐标无关
if (((x - x1) * (x - x1) + (z - z1) * (z - z1)) != 0) {
return Math.sqrt((x - x1) * (x - x1) + (z - z1) * (z - z1))
}
else {
return 0
}
}
tpos = [17, 10, 67]
poss = []
for (let i = 0; i > -5; i--) {
for (let j = 0; j <= 7; j++) {
poss.push([0, j, i])
}
}
}
async function openDoor() {
for (let i = 3.14; i < 3.14 + 1.57; i += 0.01) {//这个需要考虑你开始旋转的方向和角度,一个π是半圈
for (let j in poss) {
var jv = jvli(tpos[0], tpos[1], tpos[2], tpos[0] + poss[j][0], tpos[1] + poss[j][1], tpos[2] + poss[j][2])//旋转半径
if (Math.floor(tpos[0] + Math.sin(i) * jv) != Math.floor(tpos[0] + Math.sin(i - 0.01) * jv)
|| Math.floor(tpos[1] + Math.cos(i) * jv) != Math.floor(tpos[1] + Math.cos(i - 0.01) * jv)) {//如果这个方块在旋转时终于改变了位置
voxels.setVoxel(Math.floor(tpos[0] + Math.sin(i - 0.01) * jv), tpos[1] + poss[j][1], Math.floor(tpos[2] + Math.cos(i - 0.01) * jv), 'air')//删除原先方块
voxels.setVoxel(Math.floor(tpos[0] + Math.sin(i) * jv), tpos[1] + poss[j][1], Math.floor(tpos[2] + Math.cos(i) * jv), 'board_04')//新建方块,这里我旋转对象只有一种方块,如果有多种可以在生成数据时添加一项作为方块种类
}
}
await sleep(10)
}
}
同样这个代码也可以让方块绕x轴或者z轴旋转
效果大概

(源灵新图,打码一下)
诶这样,谁能把这个代码替我解释清楚我就告诉他新图是什么![]()
韵律源点Arcaea这种魔鬼代码是人能写出来的吗
原理我推测是用三角函数来判断方块旋转后的位置并进行方块的转移(?)
而这一串
if (Math.floor(tpos[0] + Math.sin(i) * jv) != Math.floor(tpos[0] + Math.sin(i - 0.01) * jv)
|| Math.floor(tpos[1] + Math.cos(i) * jv) != Math.floor(tpos[1] + Math.cos(i - 0.01) * jv))
我觉得是比较方块旋转前后的x坐标与z坐标 但是这个-0.01是真的没看懂()
function jvli(x, y, z, x1, y1, z1) { //只计算xz轴距离 因为绕y轴旋转时转动半径和y坐标无关
if (((x - x1) * (x - x1) + (z - z1) * (z - z1)) != 0) {
return Math.sqrt((x - x1) * (x - x1) + (z - z1) * (z - z1))
}
else {
return 0
}
}
这个函数的原理我认为是通过判断要返回的目标数据是否为0来判断的 若不是则返回一个平方根作为半径
剩下的路人的注释都解释的差不多了我觉得不用说了()
点赞0
评论
凎 -0.01是上次循环的i值,用来判断这一次循环和上一次循环方块位置是否不同(不考虑Y坐标原因说过),因为岛三方块设置会对准网格,所以如果不判断就会出现方块原地删除添加的状态而且更卡
那个距离函数实际上是个二位平面坐标公式,如果用xy表示的话就是√(x1-x2)^2+(y1-y2)^2,这里用xz表示,判断是否为零其实不需要,这个代码有点难调所以我需要防止各种原因出错(当然不必要哈)
我寻思二维平面间两点的距离公式不是高一接触的吗 路人yyds!
function jvli(x, y, z, x1, y1, z1) { //只计算xz轴距离 因为绕y轴旋转时转动半径和y坐标无关
if (((x - x1) * (x - x1) + (z - z1) * (z - z1)) != 0) {//如果这个方块不在旋转轴
return Math.sqrt((x - x1) * (x - x1) + (z - z1) * (z - z1))
}
else {
return 0
}
}
tpos = [17, 10, 67]
poss = []
for (let i = 0; i > -5; i--) {
for (let j = 0; j <= 7; j++) {
poss.push([0, j, i])
}
}
}
async function openDoor() {
for (let i = 3.14; i < 3.14 + 1.57; i += 0.01) {//这个需要考虑你开始旋转的方向和角度,一个π是半圈
for (let j in poss) {
var jv = jvli(tpos[0], tpos[1], tpos[2], tpos[0] + poss[j][0], tpos[1] + poss[j][1], tpos[2] + poss[j][2])//旋转半径
if (Math.floor(tpos[0] + Math.sin(i) * jv) != Math.floor(tpos[0] + Math.sin(i - 0.01) * jv)
|| Math.floor(tpos[1] + Math.cos(i) * jv) != Math.floor(tpos[1] + Math.cos(i - 0.01) * jv)) {//如果这个方块在旋转时终于改变了位置
voxels.setVoxel(Math.floor(tpos[0] + Math.sin(i - 0.01) * jv), tpos[1] + poss[j][1], Math.floor(tpos[2] + Math.cos(i - 0.01) * jv), 'air')//删除原先方块
voxels.setVoxel(Math.floor(tpos[0] + Math.sin(i) * jv), tpos[1] + poss[j][1], Math.floor(tpos[2] + Math.cos(i) * jv), 'board_04')//新建方块,这里我旋转对象只有一种方块,如果有多种可以在生成数据时添加一项作为方块种类
}
}
await sleep(10)
}
}点赞0
评论