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

(源灵新图,打码一下)
诶这样,谁能把这个代码替我解释清楚我就告诉他新图是什么![]()
韵律源点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
评论
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
评论