javascript - 如何在 javascript 中翻译 3D 对象
问题描述
我正在尝试围绕其 x 轴对 3d 对象进行简单旋转。该程序设置了一个片段和顶点着色器以用于 WebGl 程序中的对象。该程序包含 onLoad 函数,一旦程序加载到您的网络浏览器中,该函数就会激活函数内的所有内容。首先,该函数设置要用于保存 3D 对象或要使用的对象的画布。然后我创建我正在转换的 3D 块对象,它默认设置在原点。我正在创建一个新列表并用旧列表中的所有向量填充它,同时还对每个向量应用翻译。我相信我的问题在于尝试将翻译应用于每个向量的 for 循环。
const vertex_shader = `
attribute vec4 vPosition;
attribute vec4 vColor;
uniform mat4 transform;
varying vec4 fColor;
void main()
{
gl_Position = transform * vPosition;
fColor = vColor;
gl_PointSize = 10.0;
}`;
const fragment_shader = `
precision mediump float;
varying vec4 fColor;
void main()
{
gl_FragColor = fColor;
}`;
let params = {
transform: mat4(),
transformLoc: undefined,
maxVertices: 7000,
colors: undefined
};
function params_setup(gl, program) {
params.transformLoc = gl.getUniformLocation(program, "transform");
gl.uniformMatrix4fv(params.transformLoc, false, flatten(params.transform));
// params.bands = 5;
// params.sides = 10;
}
window.onload = function init()
{
const lg = noLogging("Firebrick");
lg.insertAtEnd = false;
let canvas = document.getElementById( "gl-canvas" );
let gl = WebGLUtils.setupWebGL( canvas );
if ( !gl ) { alert( "WebGL isn't available" ); }
gl.enable(gl.DEPTH_TEST);
// gl.enable(gl.CULL_FACE);
gl.cullFace(gl.BACK);
//
// Configure WebGL
//
gl.viewport( 0, 0, canvas.width, canvas.height );
X11.clearColor(gl, X11.AliceBlue);
// Load shaders and initialize attribute buffers
let program = initShaders( gl, vertex_shader, fragment_shader);
gl.useProgram( program );
params_setup(gl, program);
//creates the block object that will be transformed
let blk = new cs4722_objects.Block();
blk.height = .75;
blk.width = .5;
blk.depth = .25;
let vertices = blk.points;
let colors = blk.color_scheme;
let trans = rotateX(45);
// modify vertices using the transformation here
let newList = [];
//I believe my problem resides in this for loop here
for(var i = 0; i < vertices.length; i++)
{
newList.push(mult(trans, vertices[i]));
}
//to here
let bufferId = gl.createBuffer();
gl.bindBuffer( gl.ARRAY_BUFFER, bufferId );
gl.bufferData( gl.ARRAY_BUFFER, 16*params.maxVertices, gl.STATIC_DRAW );
gl.bufferSubData(gl.ARRAY_BUFFER, 0, flatten(vertices));
// Associate out shader variables with our data buffer
let vPosition = gl.getAttribLocation( program, "vPosition" );
gl.vertexAttribPointer( vPosition, 4, gl.FLOAT, false, 0, 0 );
gl.enableVertexAttribArray( vPosition );
let cBufferId = gl.createBuffer();
gl.bindBuffer( gl.ARRAY_BUFFER, cBufferId );
gl.bufferData( gl.ARRAY_BUFFER, 16*params.maxVertices, gl.STATIC_DRAW );
gl.bufferSubData(gl.ARRAY_BUFFER, 0, flatten(colors));
let vColor = gl.getAttribLocation( program, "vColor" );
// four color components per color
gl.vertexAttribPointer( vColor, 4, gl.FLOAT, false, 0, 0 );
gl.enableVertexAttribArray( vColor );
function render() {
gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
gl.drawArrays( gl.TRIANGLES, 0, vertices.length);
};
render();
};
解决方案
用它:
<!DOCTYPE html>
<html>
<head>
<style>
#myDIV {
margin: auto;
border: 1px solid black;
width: 200px;
height: 100px;
background-color: coral;
color: white;
}
</style>
</head>
<body>
<p>Click the "Try it" button to rotate the DIV element:</p>
<button onclick="myFunction()">Try it</button>
<div id="myDIV">
<h1>myDIV</h1>
</div>
<script>
function myFunction() {
// Code for Safari
document.getElementById("myDIV").style.WebkitTransform = "rotate(20deg)";
// Code for IE9
document.getElementById("myDIV").style.msTransform = "rotate(20deg)";
// Standard syntax
document.getElementById("myDIV").style.transform = "rotate(20deg)";
}
</script>
<p><b>Note:</b> Internet Explorer 9 supports an alternative, the msTransform property. Newer versions of IE and Edge support the transform property (do not need the ms prefix).</p>
<p><b>Note:</b> Safari supports an alternative, the WebkitTransform property.</p>
</body>
</html>
推荐阅读
- css - Bootstrap 4 - .col 类无法正常工作
- node.js - 得到错误 500 或 403 Node JS 但不是邮递员
- python - 使用异步调用 cuda() 会导致 SyntaxError
- recaptcha - reCAPTCHA 失败的请求多于通过的请求
- asynchronous - Flutter 中 Dart 期货的问题:断言失败:第 146 行:'
':不正确 - javascript - 从垂直线的中间开始创建组合条形图和折线图 GOOGLE CHARTS
- node.js - 将 JSON 数组解析为 JSON 对象时出错
- mysql - MySQL 未将 tmpdir 路径与 tmpfs 一起使用
- getgauge - 太鼓浏览器自动化工具中如何实现拖放?
- c# - 关于 ASP.NET MVC 上的线程池 setMaxThreads