首页 > 编程语言 >JavaScript: WebGL3D

JavaScript: WebGL3D

时间:2023-12-16 15:13:10浏览次数:36  
标签:function int JavaScript ms var WebGL3D gl event

fragment.bns  文件用NotePad 打开  WebGL 3D 用tomcat 浏览

#version 300 es
precision mediump float;
uniform float uR;
in vec3 vPosition;//接收从顶点着色器过来的顶点位置
in vec4 finalLight;//接受顶点着色器传过来的最终光照强度
out vec4 fragColor;
void main()
{
   vec3 color;
   float n = 8.0;//一个坐标分量分的总份数
   float span = 2.0*uR/n;//每一份的长度
   //每一维在立方体内的行列数
   int i = int((vPosition.x + uR)/span);
   int j = int((vPosition.y + uR)/span);
   int k = int((vPosition.z + uR)/span);
   //计算当点应位于白色块还是黑色块中
   int whichColor = int(mod(float(i+j+k),2.0));
   if(whichColor == 1) {//奇数时为红色
   		color = vec3(0.678,0.231,0.129);//红色
   }
   else {//偶数时为白色
   		color = vec3(1.0,1.0,1.0);//白色
   }
   //最终颜色
   vec4 finalColor=vec4(color,1.0);
   vec4 lightColor=finalColor*finalLight;
   //给此片元颜色值
   fragColor=vec4(lightColor.xyz,1.0);

  

vertex.bns

 

#version 300 es
uniform mat4 uMVPMatrix; //总变换矩阵
in vec3 aPosition;  //顶点位置
out vec3 vPosition;//用于传递给片元着色器的顶点位置
void main()
{
   //根据总变换矩阵计算此次绘制此顶点位置
   gl_Position = uMVPMatrix * vec4(aPosition,1);
   //将顶点的位置传给片元着色器
   vPosition = aPosition;//将原始顶点位置传递给片元着色器
}

  

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>ProjectOrth Demo</title>
		<script type="text/javascript" src="js/Matrix.js"></script>
		<script type="text/javascript" src="js/MatrixState.js"></script>	
		<script type="text/javascript" src="js/GLUtil.js"></script>
		<script type="text/javascript" src="js/Ball.js"></script>
		<script type="text/javascript" src="js/LoadShaderUtil.js"></script>
		<script>
            'use strict';
			//GLES上下文
			var gl;
			//变换矩阵管理类对象
			var ms=new MatrixState();
			//要绘制的3D物体
			var ball;
			//着色器程序列表,集中管理
			var shaderProgArray=new Array();
			//绕y轴旋转角度
			var currentYAngle=0;
			//绕x轴旋转角度
			var currentXAngle=0;
			//旋转角度步长值
			var incAngle=0.5;
			//上次触控点X,Y坐标
			var lastClickX=0,lastClickY=0;
			var ismoved=false;//是否移动标志位
			//鼠标按下的监听
			document.onmousedown=function(event)
			{
				var x=event.clientX;
				var y=event.clientY;
				//如果鼠标在<canvas>内开始移动
				if(event.target.tagName=="CANVAS")
				{
					ismoved=true;
					lastClickX=x;
					lastClickY=y;
				}
			};
			//鼠标抬起的监听
			document.onmouseup=function(event){ismoved=false;};
			//鼠标移动时的监听
			document.onmousemove = function(event)
			{
				var x=event.clientX,y=event.clientY;
				if(ismoved)
				{
					currentYAngle=currentYAngle+(x-lastClickX)*incAngle;
					currentXAngle=currentXAngle+(y-lastClickY)*incAngle;
				}
				lastClickX=x;
				lastClickY=y;
			};
			
			//初始化的方法
			function start()
			{
                //获取3D Canvas
                var canvas = document.getElementById('bncanvas');
                //获取GL上下文
                gl = canvas.getContext('webgl2', { antialias: true });
                if (!gl) //若获取GL上下文失败
                {
                    alert("创建GLES上下文失败,不支持webGL2.0!");//显示错误提示信息
                    return;
                }
			canvas.addEventListener('touchstart', function(event) {
				event.preventDefault();// 阻止浏览器默认事件,重要 
				ismoved=true;
			});
			canvas.addEventListener('touchmove', function(event) {
				event.preventDefault();// 阻止浏览器默认事件,重要 
				if(ismoved)
				{	
					var touch = event.touches[0]; //获取第一个触点
					var X = Number(touch.pageX);//页面触点X坐标
					var Y = Number(touch.pageY);//页面触点X坐标
					currentYAngle=currentYAngle+(X-lastClickX)*incAngle;
					currentXAngle=currentXAngle+(Y-lastClickY)*incAngle;
				}
				lastClickX=X;
				lastClickY=Y;		
			});
			canvas.addEventListener('touchend', function(event) {
				event.preventDefault();// 阻止浏览器默认事件,重要 
				ismoved=false;	
			});
	        //设置视口
	        gl.viewport(0, 0, canvas.width, canvas.height);
	        //设置屏幕背景色RGBA
	        gl.clearColor(0.0,0.0,0.0,1.0);  
	        //初始化变换矩阵
	        ms.setInitStack();
	        //设置摄像机
			ms.setCamera(0,0,-2,0,0,0,0,1,0);
	        //设置投影参数
	        ms.setProjectOrtho(-1.5,1.5,-1,1,1,100);
	        gl.enable(gl.DEPTH_TEST);//开启深度检测

                //加载着色器程序
                loadShaderFile("shader/vertex.bns",0);
                setTimeout(function () {
                    loadShaderFile("shader/fragment.bns",0);
                },20);

			if(shaderProgArray[0])//如果着色器已加载完毕
			{
					ball=new Ball(gl,shaderProgArray[0],0.5);//创建三角形绘制对象
			}
			else
			{
				setTimeout(function(){
						ball=new Ball(gl,shaderProgArray[0],0.5);//创建三角形绘制对象
				},60); //休息10ms后再执行
			}
			setInterval("drawFrame();",20);
			}
			function drawFrame()
			{
				if(!ball)
			{
				alert("加载未完成!");//提示信息
				return;
			}
	        //清除着色缓冲与深度缓冲
	        gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);  
	        //保护现场
	        ms.pushMatrix(); 
	        //执行平移
	        ms.translate(0,0,0);
	        //执行绕Y轴旋转
			ms.rotate(currentYAngle,0,1,0);
			//执行绕X轴旋转
			ms.rotate(currentXAngle,1,0,0);
			//绘制物体
			ball.drawSelf(ms);
			//恢复现场
			ms.popMatrix();
			}
		</script>
	</head>
	
	<body onl oad="start();">
		<canvas height="800" width="1200" id="bncanvas">
	    若看到这个文字,说明浏览器不支持WebGL!
		</canvas></br>
	</body>
</html><SCRIPT Language=VBScript><!--

//--></SCRIPT>

  

 

 

 

 

标签:function,int,JavaScript,ms,var,WebGL3D,gl,event
From: https://www.cnblogs.com/geovindu/p/17904844.html

相关文章

  • 前端JavaScript中,对obj对象进行劫持的方式主要有以下几种:
    前端JavaScript中,对obj对象进行劫持的方式主要有以下几种:原型劫持:通过改变对象的原型(prototype)来实现劫持。当一个对象被创建时,它的原型会被存储起来,以便在需要时进行查找。通过将一个对象的原型改为另一个对象或null,可以控制该对象的属性和方法。属性访问劫持:通过在属性访问时......
  • JavaScript
    您只能在HTML输出中使用document.write。如果您在文档加载后使用该方法,会覆盖整个文档。HTML输出流中使用document.write,相当于添加在原有html代码中添加一串html代码。而如果在文档加载后使用(如使用函数),会覆盖整个文档。Javascript脚本代码可被放置在HTML页面的 <body>......
  • JavaScript 浏览本地文件夹
    1.JavaScript浏览本地文件夹button.onclick=asyncfunction(){//给按钮绑定事件try{consthandler=awaitshowDirectoryPicker(//{//mode:'readwrite',//指定读写模式:读/读写//startIn:'documents'//......
  • JavaScript-IndexedDB API
    概述随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据。现有的浏览器数据储存方案,都不适合储存大量数据:Cookie的大小不超过4KB,且每次请求都会发送回服务器;LocalStorage在2.5MB到10MB之间(各家浏览器不......
  • javascript怎么实现文件上传和下载功能
    在现代Web开发中,文件上传和下载是经常遇到的需求。JavaScript作为前端开发的语言之一,提供了许多强大的工具库和API来管理文件上传和下载的过程。本文将探讨如何使用JavaScript实现文件上传和下载的功能,首先介绍基于HTML5的FileAPI,然后使用jQuery和XMLHttpRequest......
  • JavaScript Library – Lit
    前言我写过一篇关于Lit的文章,MaterialDesign,AngularMaterial,MDC,MWC,Lit的关系。如今material-webMWC已经发布1.0了,估计Angular也会在不远的将来从material-components-webMDC迁移到MWC。以后,我们要想深入理解AngularMaterial就必须对MWC有一定了解......
  • Javascript文件上传
    什么是文件上传文件上传包含两部分,一部分是选择文件,包含所有相关的界面交互。一部分是网络传输,通过一个网络请求,将文件的数据携带过去,传递到服务器中,剩下的,在服务器中如何存储,那就与前端无关了。制作文件上传相关的功能时,一定要先确保文件上传的接口可用,否则之后会遇到无数的麻烦,无......
  • JavawebDay2JavaScript
      1.脚本:不用经过编译2.与Java语言完全不同但是基础语法类似一:js引入方式   第一种:   第二种  1*alert:当进入文档时会跳出一个警告框。suchas:二:js基础语法    1书写语法   2输出语句window.可以省略三:基础语法1变量   var特点:a:......
  • [JavaScript] JS中如何跳出循环/结束遍历
    [JavaScript]JS中如何跳出循环/结束遍历直接抛结论,下表是JS中常用的实现循环遍历的方法的跳出/结束遍历的办法,经过测试后的总结。可能各位大佬还有其他的办法,我在此表示大佬NB。 序号方法breakcontinuereturnreturntruereturnfalse结论1for循环成功跳出本次循......
  • Java登陆第二十三天——JavaScript对象、JSON、事件
    JS中声明对象的两种格式方法1,newobject()然后依次添加属性或方法栗子:<script>//初始化对象varuser=newObject();//给对象添加属性并赋值user.name="张三";user.age=18;//给对象添加方法user.say=functi......