LayaBox1.8.4实现战争迷雾效果

实现思路:

和Unity实现思路一样,可看我写的下面的一篇文章

战争迷雾FogOfWar---Unity中实现-CSDN博客

根据碰撞点可以计算出需要透明的位置,怎样计算如下:

根据迷雾mesh的长宽和纵向横向的的像素数可以得出,每个小方格的长和宽,然后就可以计算出碰撞点属于第几个格子,然后将周围一定范围内的格子透明即可。 

实现代码:

自定义迷雾mesh代码:

var FogOfWarMesh=(function(_super){
	function FogOfWarMesh(long,width,stacks,slices){
		/**@private */
		this._long=NaN;
		/**@private */
		this._width=NaN;
		/**@private */
		this._stacks=0;
		/**@private */
		this._slices=0;
		(long===void 0)&& (long=10);
		(width===void 0)&& (width=10);
		(stacks===void 0)&& (stacks=100);
		(slices===void 0)&& (slices=100);
		FogOfWarMesh.__super.call(this);
		this._long=long;
		this._width=width;
		this._stacks=stacks;
		this._slices=slices;
		this.activeResource();
		this._positions=this._getPositions();
		this._generateBoundingObject();
        this.pos = new Laya.Vector2();
        this.isInit = true;
	}

	Laya.class(FogOfWarMesh,'laya.d3.resource.models.FogOfWarMesh',_super);
	var __proto= FogOfWarMesh.prototype;
	__proto.recreateResource=function(){
        this._numberVertices=(this._stacks+1)*(this._slices+1);
		this._numberIndices=this._stacks *this._slices *2 *3;
		var indices=new Uint16Array(this._numberIndices);
		var vertexDeclaration=Laya.VertexPositionNormalColor.vertexDeclaration;
		var vertexFloatStride=vertexDeclaration.vertexStride / 4;
		this.vertices= this.vertices || new Float32Array(this._numberVertices *vertexFloatStride);
		var halfLong=this._long / 2;
		var halfWidth=this._width / 2;
		var stacksLong=this._long / this._stacks;
		var slicesWidth=this._width / this._slices;
        this.FillVert(this.vertices,stacksLong,slicesWidth,halfLong,halfWidth,this.pos);
        var indiceIndex=0;
		for (i=0;i < this._slices;i++){
			for (j=0;j < this._stacks;j++){
				indices[indiceIndex++]=(i+1)*(this._stacks+1)+j;
				indices[indiceIndex++]=i *(this._stacks+1)+j;
				indices[indiceIndex++]=(i+1)*(this._stacks+1)+j+1;
				indices[indiceIndex++]=i *(this._stacks+1)+j;
				indices[indiceIndex++]=i *(this._stacks+1)+j+1;
				indices[indiceIndex++]=(i+1)*(this._stacks+1)+j+1;
			}
		}
		this._vertexBuffer=new Laya.VertexBuffer3D(vertexDeclaration,this._numberVertices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true);
		this._indexBuffer=new Laya.IndexBuffer3D(/*laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort",this._numberIndices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true);
		this._vertexBuffer.setData(this.vertices);
		this._indexBuffer.setData(indices);
		this.memorySize=(this._vertexBuffer._byteLength+this._indexBuffer._byteLength)*2;
		this.completeCreate();
	}

    __proto.FillVert = function(vertices,stacksLong,slicesWidth,halfLong,halfWidth,pos){
        var verticeCount=0;
		for (var i=0;i <=this._slices;i++){
			for (var j=0;j <=this._stacks;j++){
				vertices[verticeCount++]=j *stacksLong-halfLong;
				vertices[verticeCount++]=0;
				vertices[verticeCount++]=i *slicesWidth-halfWidth;
				vertices[verticeCount++]=0;
				vertices[verticeCount++]=1;
				vertices[verticeCount++]=0;
				vertices[verticeCount++]=0;
				vertices[verticeCount++]=0;
                vertices[verticeCount++]=0;
				vertices[verticeCount]= pos && ((Math.abs(i - pos.x - 15) < 10 && Math.abs(j - pos.y) < 10)?0:this.isInit? 1 :vertices[verticeCount]);
				verticeCount++
			}
		};
        this.isInit = false;
    }

    __proto.updateVert = function (pos) {
        this.pos = pos;
        this.recreateResource();
    }

	return FogOfWarMesh;
})(Laya.PrimitiveMesh)

迷雾调用代码:

        //添加3D场景
        var scene = Laya.stage.addChild(new Laya.Scene());

        //添加照相机
        var camera = (scene.addChild(new Laya.Camera(0, 0.1, 100)));
        camera.transform.translate(new Laya.Vector3(0, 10, 10));
        camera.transform.rotate(new Laya.Vector3(-60, 0, 0), true, false);
        camera.clearColor = null;

        //添加方向光
        var directionLight = scene.addChild(new Laya.PointLight());
        directionLight.transform.translate(new Laya.Vector3(0,2,0));
        directionLight.color = new Laya.Vector3(0.5, 0.5, 0.5);
        directionLight.direction = new Laya.Vector3(0, 1, 0);

        var player = scene.addChild(new Laya.MeshSprite3D(new Laya.BoxMesh(1,1,1)));
        player.transform.translate(new Laya.Vector3(0,0,-1));
        player.transform.rotate(new Laya.Vector3(0, 0, 0), false, false);
        var st = new Laya.BlinnPhongMaterial();
		st.albedoTexture = Laya.Texture2D.load("res/layabox.png");
        player.meshRender.shareMaterial = st;
        
        //添加自定义模型
		var width = 50;
		var height = 50;
        var stacks = 200;
        var slices = 200;
        this.mesh = new FogOfWarMesh(width,height,stacks,slices);//new CustomMesh(10, 10);
        var box = scene.addChild(new Laya.MeshSprite3D(this.mesh));
        box.transform.translate(new Laya.Vector3(0,3,-1));
        box.transform.rotate(new Laya.Vector3(0, 0, 0), false, false);
        var material = new Laya.StandardMaterial();
        material.blend = Laya.BaseMaterial.BLEND_ENABLE_SEPERATE;
        box.meshRender.material = material;
		var boxCollider = box.addComponent(Laya.BoxCollider);
		boxCollider.setFromBoundBox(this.mesh.boundingBox)
		var w = width/stacks;
		var h = height/stacks;
		var fogPos = new Laya.Vector3();
		Laya.Vector3.subtract(box.transform.position, new Laya.Vector3(width/2,0,height/2),fogPos);

        var self = this;
        Laya.timer.loop(100,this,function(){
            var pos = player.transform.position;
			var up = new Laya.Vector3(0, 100, 0);
			Laya.Vector3.add(pos,up,up);
            var ray = new Laya.Ray(pos, up);
			var _outHitInfo = new Laya.RaycastHit();
			Laya.Physics.rayCast(ray, _outHitInfo, 30, 0);
            self.mesh.updateVert(new Laya.Vector2((_outHitInfo.position.z - fogPos.z)/h,(_outHitInfo.position.x - fogPos.x)/w));
        });

 实现效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924843.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux安装部署mysql资料

安装虚拟机 等待检查完成 选择中文 软件选择 网络和主机名 开始安装 设置root密码 ADH-password 创建用户 等待安装完成 重启 接受许可证 Centos 7 64安装完成 安装mysql开始 Putty连接指定服务器 在 opt目录下新建download目录 将mysql文件传到该目录下 查看linux服务器的…

【计算机系统基础】程序数据与ELF数据节

目录 1. 任务描述 2. 实验阶段 2.1 反汇编获取重定位记录 2.2 分析 2.3 查看节头表&#xff0c;确定偏移量 2.4 使用hexedit工具修改指定内容 1. 任务描述 修改二进制可重定位目标文件“phase1.o”的数据&#xff08;.data&#xff09;节内容&#xff08;不允许修改其他节…

csp-j初赛模拟试题(解析)

题目&#xff1a; 在 C中&#xff0c;以下哪个关键字用于实现多态性&#xff1f; A. virtualB. staticC. externD. const 以下数据结构中&#xff0c;不属于线性结构的是&#xff08; &#xff09;。 A. 栈B. 队列C. 二叉树D. 链表 一个有 8 个顶点的无向图&#xff0c;若每个…

OSG开发笔记(三十五):OsgUtil::Optimizer:优化场景策略,提升显示性能和渲染效率

​若该文为原创文章&#xff0c;未经允许不得转载 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/144092964 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 长沙红胖子Qt…

Axure RP教程:创建高效用户界面和交互

Axure RP是一款广受好评的软件&#xff0c;专门用于设计精致的用户界面和交互体验。这款软件提供了众多UI控件&#xff0c;并根据它们的用途进行了分类。与此同时&#xff0c;国产的即时设计软件作为Axure的替代品&#xff0c;支持在线协作和直接在浏览器中使用&#xff0c;无需…

1 ISP一键下载

BOOT0BOOT1启动模式说明0X用户Flash用户闪存存储器&#xff0c;也就是Flash启动10系统存储器系统存储器启动&#xff0c;串口下载11SRAM启动SRAM启动&#xff0c;用于在SRAM中调试代码 闪存存储器 是STM32 的内置FLASH,一般使用JTAG或者SWD模式下载程序时&#xff0c;就是下载…

【数据结构与算法】链表之美-复杂链表的复制与链表的插入排序

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 1.复杂链表的复制 题目&#xff1a;请实现 copyRandomList 函数&#xff0c;复制一个复杂链表。在复杂链表中…

统计字符串中单词出现的次数

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <map> #include <string> int main() {std::string s;//std::cin >> s;s " aaa aaaaa a aa aaa aaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa Hi I am a person a…

comfyui使用记录-PuLID_Flux模型使用

文章目录 1.PuLID模型简介&#xff1a;2.PuLID_Flux 工作流的部署流程安装pulid节点 3.部署遇到的一些问题加载这个节点错误&#xff1a;PulidFluxInsightFaceLoaderPulidFluxEvaClipLoader加载错误 4.PuLID模型的出图效果5.一些参数的设置用到的提示词 1.PuLID模型简介&#x…

threeJs学习 贴图 :地球

效果图&#xff1a; 贴图以后的效果&#xff1a; vue代码&#xff1a; <template><div class"scene_box"><p>创建纹理贴图TextureLoader</p><div class"canvas"></div></div> </template><script s…

联想品牌的电脑 Bios 快捷键是什么?如何进入 Bios 设置?

在某些情况下&#xff0c;您可能需要通过U盘来安装操作系统或进行系统修复。对于联想电脑用户来说&#xff0c;了解如何设置U盘作为启动设备是非常有用的技能之一。本文简鹿办公将指导您如何使用联想电脑的 U 盘启动快捷键来实现这一目标。 联想笔记本 对于大多数联想笔记本电…

SmartSQL:一款方便、快捷的数据库文档查询、导出工具

&#x1f6a9; 项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具&#xff01;从最初仅支持SqlServer数据库、CHM文档格式开始&#xff0c;通过不断地探索开发、集思广益和不断改进&#xff0c;又陆续支持Word、Excel、PDF、Html、Xml、Json、MarkDown等文档格式…

Transformer?Attention?——Are All You Need!

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要较为深入地讲述 transformer 模型及 attention 机制等相关深度学习的知识&#xff0c;主要介绍模型结构、原理等。Transformer 属于是当下比较流行和创新的深度学习的基础模型架构&#xff0c;主要应用于自然语言处理&a…

24.11.28 Cookie

cookie_webstorage 1.cookie 每次请求时 可以把cookie自定义的数据 传给服务端 (请求参数 请求头之外 报文传自定义数据的位置 cookie可以长期保存) cookie特点 1.数据格式只有字符串 2.按键值对存储 3.对中文支持较差(尽量不要用中文) 4.按照网站(域 domain)存储 5.可…

尚硅谷前端 (wsy答辩)

尚硅谷前端 &#xff08;wsy答辩&#xff09; 文章目录 尚硅谷前端 &#xff08;wsy答辩&#xff09;一、前端开发过程和框架1.框架目录结构认识1.程序的入口 有两个 第一个是index,html , 第二个在SRC目录下的main,js2.前端页面环境使用框架&#xff08;模板&#xff09;3、框…

不间断电源 (UPS) 对现代技术可靠性的影响

在这个技术型世界里&#xff0c;无论是在个人还是商业环境中&#xff0c;电力供应商提供的稳定供电都变得越来越重要。 不间断电源 (UPS) 系统是一种不可或缺的解决方案&#xff0c;可保证终端设备不受干扰地运行&#xff0c;在出现电源问题或故障时让用户继续工作。 这篇文章…

【05】Selenium+Python 两种文件上传方式(AutoIt)

上传文件的两种方式 一、input标签上传文件 可以用send_keys方法直接上传文件 示例代码 input标签上传文件import time from selenium import webdriver from chromedriver_py import binary_path # this will get you the path variable from selenium.webdriver.common.by i…

leetcode 二叉树的最大深度

104. 二叉树的最大深度 已解答 简单 相关标签 相关企业 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3…

MATLAB - ROS2 ros2genmsg 生成自定义消息(msg/srv...)

系列文章目录 前言 语法 ros2genmsg(folderpath)ros2genmsg(folderpath,NameValue) 一、说明 ros2genmsg(folderpath) 通过读取指定文件夹路径下的 ROS 2 自定义信息和服务定义来生成 ROS 2 自定义信息。函数文件夹必须包含一个或多个 ROS 2 软件包。这些软件包包含 .msg 文件…

使用 Elastic 和 Apple 的 OpenELM 模型构建 RAG 系统

作者&#xff1a;来自 Elastic Gustavo Llermaly 如何部署和测试新的 Apple 模型并使用 Elastic 构建 RAG 系统。 在本文中&#xff0c;我们将学习部署和测试新的 Apple 模型&#xff0c;并构建一个 RAG 系统来模拟 Apple Intelligence&#xff0c;使用 Elastic 作为向量数据库…