猫史档案馆


【岛3新(?)科技】让方块绕坐标轴旋转的代码

用户:阳光的流熔怪Uyt5阳光的流熔怪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轴旋转

效果大概

center_image

(源灵新图,打码一下)

诶这样,谁能把这个代码替我解释清楚我就告诉他新图是什么emotion_doge


回复

上一页第 1 页 / 共 1 页下一页
阳光的流熔怪Uyt5阳光的流熔怪Uyt5

喵d

点赞1


评论


未命名用户015734未命名用户015734

硬核打码

路人yyds

点赞1


评论

观澜yyds!


Forzen_SevenForzen_Seven

yyds

点赞1


评论


阳光的流熔怪Uyt5阳光的流熔怪Uyt5

喵

点赞1


评论


无尽深空无尽深空

一堆破石头。

点赞0


评论


韵律源点Arcaea韵律源点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!


凌_墨水凌_墨水

ddd

点赞0


评论


阳光的流熔怪Uyt5阳光的流熔怪Uyt5

喵

点赞0


评论


成熟的强袭编程猫548成熟的强袭编程猫548

都城?()

点赞0


评论


指令者指令者

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


评论


指令者指令者

尹子跨地图建筑器是什么来着?我忘记他的代码了(急)

点赞0


评论


该账号已被封禁该账号已被封禁

源灵新图不带我是不是有点笋)))

点赞0


评论

问观澜)))


YDS尹子YDS尹子

路人威武

我之前做的有误差)))

点赞0


评论

转45度会有洞)