matlab给球贴图,如何使用WebGL给球体添加纹理贴图

JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

var gl;

var SPHERE_NUM = 12;

function initGL(canvas) {

try {

gl = canvas.getContext("webgl");

gl.viewportWidth = canvas.width;

gl.viewportHeight = canvas.height;

} catch (e) {}

if (!gl) {

alert("Could not initialise WebGL, sorry :-(");

}

}

//load glsl scripts from dom

function getShader(gl, id) {

var shaderScript = document.getElementById(id);

if (!shaderScript) {

return null;

}

var str = "";

var k = shaderScript.firstChild;

while (k) {

if (k.nodeType == 3) {

str += k.textContent;

}

k = k.nextSibling;

}

var shader;

if (shaderScript.type == "x-shader/x-fragment") {

shader = gl.createShader(gl.FRAGMENT_SHADER);

} else if (shaderScript.type == "x-shader/x-vertex") {

shader = gl.createShader(gl.VERTEX_SHADER);

} else {

return null;

}

gl.shaderSource(shader, str);

gl.compileShader(shader);

if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {

alert(gl.getShaderInfoLog(shader));

return null;

}

return shader;

}

var shaderProgram;

function initShaders() {

var fragmentShader = getShader(gl, "shader-fs");

var vertexShader = getShader(gl, "shader-vs");

shaderProgram = gl.createProgram();

gl.attachShader(shaderProgram, vertexShader);

gl.attachShader(shaderProgram, fragmentShader);

gl.linkProgram(shaderProgram);

if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {

alert("Could not initialise shaders");

}

gl.useProgram(shaderProgram);

shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");

gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);

shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord");

gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);

shaderProgram.vertexNormalAttribute = gl.getAttribLocation(shaderProgram, "aVertexNormal");

gl.enableVertexAttribArray(shaderProgram.vertexNormalAttribute);

shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");

shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");

shaderProgram.nMatrixUniform = gl.getUniformLocation(shaderProgram, "uNMatrix");

shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler");

shaderProgram.useLightingUniform = gl.getUniformLocation(shaderProgram, "uUseLighting");

shaderProgram.ambientColorUniform = gl.getUniformLocation(shaderProgram, "uAmbientColor");

shaderProgram.lightingDirectionUniform = gl.getUniformLocation(shaderProgram, "uLightingDirection");

shaderProgram.directionalColorUniform = gl.getUniformLocation(shaderProgram, "uDirectionalColor");

shaderProgram.alphaUniform = gl.getUniformLocation(shaderProgram, "uAlpha");

}

function handleLoadedTexture(texture) {

gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);

gl.bindTexture(gl.TEXTURE_2D, texture);

gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.image);

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);

gl.generateMipmap(gl.TEXTURE_2D);

gl.bindTexture(gl.TEXTURE_2D, null);

}

var dropTexture;

function initTexture() {

dropTexture = gl.createTexture();

dropTexture.image = new Image();

dropTexture.image.onload = function() {

handleLoadedTexture(dropTexture)

}

dropTexture.image.src = "/assets/love_half_r.png";

}

var g_mMatrix = [];

var g_invMatrix = [];

var mvMatrix = mat4.create();

var pMatrix = mat4.create();

//init model/view matrix for mapping multiple drops

var move = [0.05, 0.0, 0.0];

for (var i = 0; i < SPHERE_NUM; i++) {

randx = Math.random() * 20.0 - 10.0;

randy = Math.random() * 10;

randz = Math.random() * 4.0 - 20.0;

move = [randx, randy, randz];

g_mMatrix[i] = mat4.identity(mat4.create());

g_invMatrix[i] = mat4.identity(mat4.create());

mat4.translate(g_mMatrix[i], move, g_mMatrix[i]);

mat4.inverse(g_mMatrix[i], g_invMatrix[i]);

}

function setMatrixUniforms(i) {

if (g_mMatrix.length == 0) {

throw "Invalid mvMatrix!";

} else {

gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, g_mMatrix[i]);

}

gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false, pMatrix);

var normalMatrix = mat3.create();

mat4.toInverseMat3(g_mMatrix[i], normalMatrix);

mat3.transpose(normalMatrix);

gl.uniformMatrix3fv(shaderProgram.nMatrixUniform, false, normalMatrix);

}

function degToRad(degrees) {

return degrees * Math.PI / 180;

}

var dropRotationMatrix = mat4.create();

mat4.identity(dropRotationMatrix);

var dropVertexPositionBuffer;

var dropVertexNormalBuffer;

var dropVertexTextureCoordBuffer;

var dropVertexIndexBuffer;

function initBuffers() {

var latitudeBands = 30;

var longitudeBands = 30;

var radius = 1;

var vertexPositionData = [];

var normalData = [];

var textureCoordData = [];

for (var latNumber = 0; latNumber <= latitudeBands; latNumber++) {

var theta = latNumber * Math.PI / latitudeBands;

var sinTheta = Math.sin(theta);

var cosTheta = Math.cos(theta);

for (var longNumber = 0; longNumber <= longitudeBands; longNumber++) {

var phi = longNumber * 2 * Math.PI / longitudeBands;

var sinPhi = Math.sin(phi);

var cosPhi = Math.cos(phi);

var x = cosPhi * sinTheta;

var y = -cosTheta; //倒影效果

var z = sinPhi * sinTheta;

var u = 1 - (longNumber / longitudeBands);

var v = 1 - (latNumber / latitudeBands);

normalData.push(x);

normalData.push(y);

normalData.push(z);

textureCoordData.push(u);

textureCoordData.push(v);

//make a random ellipse

vertexPositionData.push(radius * x);

vertexPositionData.push(radius * y);

vertexPositionData.push(radius * z);

}

}

var indexData = [];

for (var latNumber = 0; latNumber < latitudeBands; latNumber++) {

for (var longNumber = 0; longNumber < longitudeBands; longNumber++) {

var first = (latNumber * (longitudeBands + 1)) + longNumber;

var second = first + longitudeBands + 1;

indexData.push(first);

indexData.push(second);

indexData.push(first + 1);

indexData.push(second);

indexData.push(second + 1);

indexData.push(first + 1);

}

}

dropVertexNormalBuffer = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, dropVertexNormalBuffer);

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(normalData), gl.STATIC_DRAW);

dropVertexNormalBuffer.itemSize = 3;

dropVertexNormalBuffer.numItems = normalData.length / 3;

dropVertexTextureCoordBuffer = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, dropVertexTextureCoordBuffer);

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoordData), gl.STATIC_DRAW);

dropVertexTextureCoordBuffer.itemSize = 2;

dropVertexTextureCoordBuffer.numItems = textureCoordData.length / 2;

dropVertexPositionBuffer = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, dropVertexPositionBuffer);

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertexPositionData), gl.STATIC_DRAW);

dropVertexPositionBuffer.itemSize = 3;

dropVertexPositionBuffer.numItems = vertexPositionData.length / 3;

dropVertexIndexBuffer = gl.createBuffer();

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, dropVertexIndexBuffer);

gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), gl.STATIC_DRAW);

dropVertexIndexBuffer.itemSize = 1;

dropVertexIndexBuffer.numItems = indexData.length;

}

function drawScene() {

gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);

gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 100.0, pMatrix);

var move = [0.0, 0.0, 0.0];

for (var i = 0; i < SPHERE_NUM; i++) {

//move= [0.0,-0.01,0.0];

//mat4.translate(g_mMatrix[i],move,g_mMatrix[i]);

g_mMatrix[i][13] -= 0.005 + i * Math.random() * 0.005;

if (g_mMatrix[i][13] < -6.5) {

g_mMatrix[i][12] = Math.random() * 20.0 - 10.0;

g_mMatrix[i][13] = 6.5;

g_mMatrix[i][14] = Math.random() * 4.0 - 20.0;

};

mvMatrix = g_mMatrix[i];

mat4.multiply(mvMatrix, dropRotationMatrix);

gl.activeTexture(gl.TEXTURE0);

gl.bindTexture(gl.TEXTURE_2D, dropTexture);

gl.uniform1i(shaderProgram.samplerUniform, 0);

var blending = false;

if (blending) {

gl.blendFunc(gl.SRC_ALPHA, gl.ONE);

gl.enable(gl.BLEND);

gl.disable(gl.DEPTH_TEST);

gl.uniform1f(shaderProgram.alphaUniform, 0.5);

} else {

gl.disable(gl.BLEND);

gl.enable(gl.DEPTH_TEST);

}

gl.bindBuffer(gl.ARRAY_BUFFER, dropVertexPositionBuffer);

gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, dropVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER, dropVertexTextureCoordBuffer);

gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, dropVertexTextureCoordBuffer.itemSize, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER, dropVertexNormalBuffer);

gl.vertexAttribPointer(shaderProgram.vertexNormalAttribute, dropVertexNormalBuffer.itemSize, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, dropVertexIndexBuffer);

setMatrixUniforms(i);

gl.drawElements(gl.TRIANGLES, dropVertexIndexBuffer.numItems, gl.UNSIGNED_SHORT, 0);

}

}

function tick() {

requestAnimationFrame(tick);

drawScene();

}

function main() {

var canvas = document.getElementById("container");

initGL(canvas);

initShaders();

initBuffers();

initTexture();

gl.clearColor(0.0, 0.0, 0.0, 0.3); //clear background

gl.enable(gl.DEPTH_TEST);

tick();

}

window.addEventListener('load', main);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
matlab编程,太阳地球月亮公转自转,球体贴图,基于matlab的仿真,实现了太阳的自转以及地球月球的自转公转。 k=6; n = 2^k-1; [x,y,z]=sphere(n ); A = imread('taiyang.png'); patches0=surf2patch(x,y,z,A); k=6; n = 2^k-1; [x,y,z]=sphere(n ); AA = imread('diqiu00.png'); patches1=surf2patch(x,y,z,AA); k=6; n = 2^k-1; [x,y,z]=sphere(n ); AAA = imread('yueqiu.png'); patches2=surf2patch(x,y,z,AAA); %set(patches,'edgecolor','none') % 设计太阳月亮地球的相对大小 Ssun=1; Searth=0.4; Smoon=0.2; % 设置太阳与地球间的距离 Res=4; % 设置地球与月亮之间的距离 Rme=1; alpha=0; beta=0; theta=0; % 设置旋转速度 step_a=0.1; %a的步长 step_b=0.2; %b的步长 step_t=0.05; %c的步长 % 设置太阳的位置 Csun=[0,0,0]; % 计时器 time=0; h=figure; % 取消坐标轴之类的属性 set(h,'toolbar','none','menubar','none','numbertitle','off') % 进入大循环 while 1==1 clf % 设置地球的位置 Cx=4*cos(alpha); Cy=4*sin(alpha); Cz=0; Cearth=[Cx,Cy,Cz]; Cmoon=[Cx+cos(2*alpha);Cy+sin(2*alpha);0;1]; patches_sun=patches0; % 绕z轴旋转坐标公式 Rz=[cos(5*theta) -sin(5*theta) 0;sin(5*theta) cos(5*theta) 0;0 0 1]; [len]=64*64; for i=1:len P=Rz*[patches0.vertices(i,1);patches0.vertices(i,2);patches0.vertices(i,3)]; patches_sun.vertices(i,1)=P(1); patches_sun.vertices(i,2)=P(2); patches_sun.vertices(i,3)=P(3); end patch(patches_sun),shading flat,hold on patches_moon=patches2; [len,t]=size(patches2.vertices); for i=1:len P=Rz*[patches2.vertices(i,1)*Smoon;patches2.vertices(i,2)*Smoon;patches2.vertices(i,3)*Smoon]+[Cmoon(1);Cmoon(2);Cmoon(3)]; patches_moon.vertices(i,1)=P(1); patches_moon.vertices(i,2)=P(2); patches_moon.vertices(i,3)=P(3); end patch(patches_moon),shading flat % 与改变太阳顶点值一致,改变地球的顶点值 patches_earth=patches1; [len,t]=size(patches1.vertices); for i=1:len P=Rz*[patches1.vertices(i,1)*Searth;patches1.vertices(i,2)*Searth;patches1.vertices(i,3)*Searth]+[Cx;Cy;Cz]; patches_earth.vertices(i,1)=P(1); patches_earth.vertices(i,2)=P(2); patches_earth.vertices(i,3)=P(3); end patch(patches_earth),shading flat daspect([1,1,1]); campos([7,7,2]),camtarget([0,0,0]),camup([0,0,1]),camva(30), % 关闭所有的坐标轴标签、刻度、背景 axis off %set(patches,'edgecolor','none') % 暂停0.1秒 pause(0.1) % 记时+1 time=time+1; % 太阳地球月亮一次改变的数值 beta=beta+step_b; alpha=alpha+step_a; theta=theta+step_t; end

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值