猫史档案馆


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

用户:阳光的流熔怪Uyt5阳光的流熔怪Uyt5查看:6 回复: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


评论


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


评论


凌_墨水凌_墨水

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


评论