首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >three.js 制作逻辑转体游戏(下)

three.js 制作逻辑转体游戏(下)

作者头像
郭先生的博客
发布于 2020-09-06 11:48:46
发布于 2020-09-06 11:48:46
3.2K00
代码可运行
举报
文章被收录于专栏:郭先生的博客郭先生的博客
运行总次数:0
代码可运行

上一篇已经对绕非定轴转动有所了解,这篇郭先生继续说一说逻辑转体游戏的制作,这部分我们同样会遇到一些小问题,首先是根据数据渲染陷阱和目标区域,然后是对可以转动的判定,最后是获胜的判定。

1. 根据数据渲染陷阱和目标区域

首先我们P一张底图和陷阱图,如下图

就像这样,然后就是根据数据渲染陷阱和目标区域了,首先陷阱的个数是固定的,而目标区域是随小方块的数量而定,先看数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
end: [[-1, -4], [-1, -5]],
trap: [[-1, -7], [-6, -2]],

这里我们看一下Shader怎么写的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let texture1 = new THREE.TextureLoader().load('/static/images/base/luojizhuanti.png');
let texture2 = new THREE.TextureLoader().load('/static/images/base/stack.png');
let trapArray = [];
let targetArray = new Array(7).fill('').map(() => new THREE.Vector2(0,0));
square[this.game].trap.forEach(d => {
    trapArray.push(new THREE.Vector2(d[0], d[1]));
})
square[this.game].end.forEach((d,i) => {
    targetArray[i] = new THREE.Vector2(d[0], d[1]);
})
uniforms = {
    texture1: {
        value: texture1
    },
    texture2: {
        value: texture2
    },
    point0: {
        value: trapArray[0]
    },
    point1: {
        value: trapArray[1]
    },
    target: {
        value: targetArray
    }
}
uniforms[ "texture2" ].value.wrapS = uniforms[ "texture2" ].value.wrapT = THREE.RepeatWrapping;
let planeMate = new THREE.ShaderMaterial({
    side: THREE.DoubleSide,
    uniforms: uniforms,
    vertexShader: `
        varying vec2 vUv;
        varying vec3 pos;
        void main() {
            vUv = uv;
            pos = position;
            gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
        }
    `,
    fragmentShader: `
        varying vec2 vUv;
        varying vec3 pos;
        uniform vec2 point0;
        uniform vec2 point1;
        uniform vec2 target[7];
        uniform sampler2D texture1;
        uniform sampler2D texture2;
        void main() {
            int index = 0;
            vec2 newUv = vec2(vUv.x * 7.0, vUv.y * 8.0);
            vec4 tcolor1 = texture2D( texture1, vUv );
            vec4 tcolor2 = texture2D( texture2, newUv );
            vec4 resultColor = tcolor1;
            if (pos.x < point0.x * 10.0 + 45.0 && pos.x > point0.x * 10.0 + 35.0 && pos.y < - point0.y * 10.0 - 40.0 && pos.y > - point0.y * 10.0 - 50.0) {
                resultColor = tcolor2;
            } else if(pos.x < point1.x * 10.0 + 45.0 && pos.x > point1.x * 10.0 + 35.0 && pos.y < - point1.y * 10.0 - 40.0 && pos.y > - point1.y * 10.0 - 50.0) {
                resultColor = tcolor2;
            } else {
                for(int i=0; i < 7; i++) {
                    if (pos.x < target[i].x * 10.0 + 45.0 && pos.x > target[i].x * 10.0 + 35.0 && pos.y < - target[i].y * 10.0 - 40.0 && pos.y > - target[i].y * 10.0 - 50.0) {
                        resultColor = vec4(1.0, 0.5, 0.0, 1.0);
                    }
                }
            }
            gl_FragColor = resultColor;
        }
    `
})

texture1和texture2是两个纹理图,trapArray是盛放陷阱的数组,targetArray是目标区域,默认长度是7,且默认值都是new THREE.Vector2(0,0),然后我们将二维向量加到以上两个数组中,最后添加到uniforms中,最后传到ShaderMaterial中,顶点着色器我们只需要将position和ui传到片元着色器中,关键是片元着色器,首先我们先得到一个新uv,这个新uv是沿x方向重复7次,沿y方向重复8次,然后tcolor1和tcolor2分别是底图的颜色和重复了7*8的陷阱的颜色。if中是渲染第一个陷阱,else if是渲染第二个陷阱,else中循环target数组,渲染target区域,具体的判断其实很简单。这样我们就根据关卡渲染了陷阱。

2. 对是否可以旋转进行判定

因为小方块是不可以超过底图的边缘的,而且也不可以直接覆盖到陷阱上面,因为这个操作是在点击上下左右的时候就要先判断可行性,但是此时我们还没有转,所以我们就要先拷贝一个boxes,先进行旋转看看出没出界或者压没压到陷阱,我们是这样实现的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
judge(num) {
    judgeGroup = new THREE.Group();
    boxesCopy = [];
    for(let i=0; i<boxes.length; i++) {
        let geom = new THREE.BoxGeometry(ratio, ratio, ratio);
        let mate = new THREE.MeshBasicMaterial({color: 0xffaa00, transparent: true, opacity: .8});
        let mesh = new THREE.Mesh(geom, mate);
        mesh.position.copy(boxes[i].position);
        boxesCopy[i] = mesh;
    }
    if(num == 1) {
        var offset = new THREE.Vector3(box3.max.x, 0, 0);
        judgeGroup.position.copy(offset);
        boxesCopy.forEach(d => {
            d.position.sub(offset);
            judgeGroup.add(d);
        })
        judgeGroup.rotation.z = - Math.PI / 2;
    } else if(num == 2) {
        var offset = new THREE.Vector3(box3.min.x, 0, 0);
        judgeGroup.position.copy(offset);
        boxesCopy.forEach(d => {
            d.position.sub(offset);
            judgeGroup.add(d);
        })
        judgeGroup.rotation.z = Math.PI / 2;
    } else if(num == 3) {
        var offset = new THREE.Vector3(0, 0, box3.min.z);
        judgeGroup.position.copy(offset);
        boxesCopy.forEach(d => {
            d.position.sub(offset);
            judgeGroup.add(d);
        })
        judgeGroup.rotation.x = - Math.PI / 2;
    } else if(num == 4) {
        var offset = new THREE.Vector3(0, 0, box3.max.z);
        judgeGroup.position.copy(offset);
        boxesCopy.forEach(d => {
            d.position.sub(offset);
            judgeGroup.add(d);
        })
        judgeGroup.rotation.x = Math.PI / 2;
    }
    judgeGroup.updateMatrixWorld();
    let canPass = true;
    boxesCopy.forEach(d => {
        var trans = new THREE.Vector3();
        d.matrixWorld.decompose(trans, new THREE.Quaternion(), new THREE.Vector3());
        let x = Math.round((trans.x - 5) / 10);
        let z = Math.round((trans.z - 5) / 10);
        let y = Math.round((trans.y + 5) / 10);
        if(x > -1 || x < -7 || z > -1 || z < -8) {
            canPass = false;
        } else {
            square[this.game].trap.forEach(d => {
                if(d[0] == x && d[1] == z && y == 1) {
                    canPass = false;
                }
            })
        }
    })
    return canPass;
},

boxesCopy就是对boxes进行的拷贝,num就是我们的上下左右操作,最后一个循环就是判断是否可翻转,x,y,z值分别对应我们的格子,if判断时候出界,因为x的界限就是-1,-7,z的界限就是-1,-8。else是判断是否压到陷阱,只要有一个成立,canPass就会变成false。这就完成了简单的旋转判断。

3. 获胜的判定

获胜的判定很简单,在每一个旋转之后,比较boxes和end数组,如果两个数组一样,那么就说明胜利了,代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
computedWin() {
    let win = true;
    let temp = [];
    boxes.forEach(d => {
        let x = Math.round((d.position.x - 5) / 10);
        let z = Math.round((d.position.z - 5) / 10);
        temp.push([x, z]);
    })
    square[this.game].end.forEach(d => {
        if(!temp.some(dd => dd[0] == d[0] && dd[1] == d[1])) {
            win = false;
        }
    })
    if(win) {
        this.win();
    }
},

最后加上一点tween动画,这样我们就完成了一个逻辑转体的游戏,游戏玩起来还是比较有意思的。

转载请注明地址:郭先生的博客

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)
文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles
点云PCL博主
2022/01/27
8770
自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)
联合训练2D-3D多任务学习 | 深度估计、检测、分割、3D检测通吃
而不是以前将这些学习目标分离到不同网络模块中的方法。这种统一的方法不仅减少了对细致的经验结构设计的需求,而且显著增强了多任务网络的表示学习能力,因为整个模型能力都致力于同时优化这三个目标。 TaskPrompt引入了一种基于Cityscapes-3D数据集的新的多任务基准,该基准要求多任务模型同时生成单目3D车辆检测、语义分割和单目深度估计的预测。这些任务对于实现对视觉场景的2D-3D联合理解至关重要,特别是在自动驾驶系统的开发中。 在这个具有挑战性的基准上,与单任务最先进的方法相比,本文的多任务模型表现出了强大的性能,并在具有挑战性3D检测和深度估计任务上建立了新的最先进的结果。
AiCharm
2023/05/15
1.4K0
联合训练2D-3D多任务学习 | 深度估计、检测、分割、3D检测通吃
基于RGB图像的单目三维目标检测网络:AM3D(ICCV)
本文介绍一篇基于RGB图像的单目三维目标检测的文章AM3D,该文发布于ICCV 2019《Accurate Monocular 3D Object Detection via Color-Embedded 3D Reconstruction for Autonomous Driving》。输入单幅RGB图像,输出三维Bounding Box信息。
计算机视觉
2021/03/17
2.1K0
基于RGB图像的单目三维目标检测网络:AM3D(ICCV)
从2D到3D的目标检测综述
论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章。公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信dianyunpcl@163.com。
点云PCL博主
2020/11/19
2.2K0
从2D到3D的目标检测综述
python3GUI--车牌、车牌颜色识别可视化系统 By:PyQt5(详细介绍)
https://www.bilibili.com/video/BV1MW7DzDELo/?spm_id_from=333.1387.upload.video_card.click
懷淰
2025/07/23
1090
python3GUI--车牌、车牌颜色识别可视化系统 By:PyQt5(详细介绍)
Poly-YOLO:更快,更精确的检测(主要解决Yolov3两大问题,附源代码)
论文地址:https://arxiv.org/pdf/2005.13243.pdf
计算机视觉研究院
2022/01/27
7840
Poly-YOLO:更快,更精确的检测(主要解决Yolov3两大问题,附源代码)
教程:使用iPhone相机和openCV来完成3D重建(第三部分)
在第二部分,我们分析了一个计算相机矩阵和失真系数的脚本。这些是三维重建过程中所必需的相机固有参数。
AI研习社
2019/05/08
1.8K0
教程:使用iPhone相机和openCV来完成3D重建(第三部分)
python3GUI--基于PyQt5+DeepSort+YOLOv8智能人员入侵检测系统(详细图文介绍)
<font size=6 color='red' padding=5>VX:A1397852386</font >
懷淰
2025/07/22
1040
python3GUI--基于PyQt5+DeepSort+YOLOv8智能人员入侵检测系统(详细图文介绍)
机器视觉------- SciSmart图像定位-ROI校正算法
感兴趣区域(ROI,region of interest),在机器视觉、图像处理中,在被处理的图像上以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,简称ROI。在图像处理领域,感兴趣区域是从图像中选择的一个图像区域,这个区域是图像分析所关注的重点。圈定该区域以便进行进一步处理,或使用ROI圈定你想处理的目标,可以减少处理时间,提高精度。
小白学视觉
2021/08/06
1.8K0
IDA-3D:基于立体视觉的自动驾驶深度感知的3D目标检测
标题:IDA-3D: Instance-Depth-Aware 3D Object Detection from Stereo Vision for Autonomous Driving
3D视觉工坊
2020/11/19
1K0
IDA-3D:基于立体视觉的自动驾驶深度感知的3D目标检测
【深度学习】目标检测
目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。
杨丝儿
2022/03/01
3.1K0
【深度学习】目标检测
【文本检测与识别-白皮书-3.1】第一节:常用的文本检测与识别方法
随着深度学习的快速发展,图像分类、目标检测、语义分割以及实例分割都取得了突破性的进展,这些方法成为自然场景文本检测的基础。基于深度学习的自然场景文本检测方法在检测精度和泛化性能上远优于传统方法,逐渐成为了主流。图1 列举了文本检测方法近几年来的发展历程。
合合技术团队
2022/10/17
1.5K0
【文本检测与识别-白皮书-3.1】第一节:常用的文本检测与识别方法
如何实现智能视觉测量系统-为什么原木智能检尺需要高精度3D相机
智能视觉测量是指用计算机视觉技术实现对物体的尺寸测量,它在工业、林业、物流等领域有重要的应用。一般做法是用相机或激光雷达对物体拍照/扫描,然后识别图像中的待测量物体,得到其边界或形状信息,最后在坐标系中计算物体的尺寸。本文将以原木智能检尺(直径测量)为例,介绍智能视觉测量系统的技术原理,以及需要解决的难点问题。
SIGAI学习与实践平台
2023/10/16
1K0
如何实现智能视觉测量系统-为什么原木智能检尺需要高精度3D相机
【C++】OpenCV:车道线检测原理与实现示例
车道线检测是自动驾驶和驾驶辅助系统中的关键任务之一。OpenCV是一个广泛使用的计算机视觉库,可以用来进行车道线检测。
DevFrank
2024/07/24
6280
全新范式 | Box-Attention同时让2D、3D目标检测、实例分割轻松涨点(求新必看)
对于目标检测、实例分割、图像分类和许多其他当前的计算机视觉挑战,一个带有Multi-Head Self-Attention的Transformer可能是所有任务都需要的。Transformer在自然语言处理中取得成功后,学习远程特征依赖在计算机视觉中也被证明是一种有效的策略。
集智书童公众号
2021/12/13
1.8K0
全新范式 | Box-Attention同时让2D、3D目标检测、实例分割轻松涨点(求新必看)
做目标检测,这一篇就够了!2019最全目标检测指南
计算机视觉是一门研究如何对数字图像或视频进行高层语义理解的交叉学科,它赋予机器“看”的智能,需要实现人的大脑中(主要是视觉皮层区)的视觉能力。
Ai学习的老章
2019/08/09
1.1K0
做目标检测,这一篇就够了!2019最全目标检测指南
图形编辑器开发:最基础但却复杂的选择工具
光标停留在图形上方,按下鼠标左键,这个图形就被选中了。这就是一个简单的选中了单个图形的场景。
前端西瓜哥
2023/08/18
5260
图形编辑器开发:最基础但却复杂的选择工具
一篇文章就梳理清楚了 Python OpenCV 的知识体系
本篇文章目的将为你详细罗列 Python OpenCV 的学习路线与重要知识点。核心分成 24 个小节点,全部掌握,OpenCV 入门阶段就顺利通过了。
码农向前冲
2021/12/27
1.7K0
一篇文章就梳理清楚了 Python OpenCV 的知识体系
[深度学习概念]·实例分割模型Mask R-CNN详解
Mask R-CNN是ICCV 2017的best paper,彰显了机器学习计算机视觉领域在2017年的最新成果。在机器学习2017年的最新发展中,单任务的网络结构已经逐渐不再引人瞩目,取而代之的是集成,复杂,一石多鸟的多任务网络模型。Mask R-CNN就是典型的代表。本篇大作的一作是何凯明,在该篇论文发表的时候,何凯明已经去了FaceBook。我们先来看一下,Mask R-CNN取得了何等的成果。
小宋是呢
2019/06/27
2.3K0
[深度学习概念]·实例分割模型Mask R-CNN详解
基于OpenCV的车辆变道检测
本期教程我们将和小伙伴们一起研究如何使用计算机视觉和图像处理技术来检测汽车在行驶中时汽车是否在改变车道!大家一定听说过使用OpenCV 的haar级联文件可以检测到面部、眼睛等,但是如果目标是汽车,公共汽车呢?
小白学视觉
2020/12/07
1.3K0
基于OpenCV的车辆变道检测
推荐阅读
相关推荐
自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档