我编写了一个代码来使WebGL中的3D眼睛动起来。我不明白的是,为什么Javascript中的右手值可以循环更改。以下是部分代码:
function start() {
...
if (GL) {
...
tick(); // For animation
}
}
function tick() {
requestAnimationFrame(tick);
updateTime();
drawScene();
}
function updateTime() {
curTime = (new Date).getTime();
if (lastTime) { // Initial value: lastTime = 0
var delta = curTime - lastTime;
eyeFrame = Math.round((delta%60000)/20); // Initial value: eyeFrame = 0
} else {
lastTime = curTime;
}
}
function drawScene() {
updateBuffers(eyeFrame);
...
}
function updateBuffers(idx) {
curV = V; // V is the 3D coordinates, must not change
for (i=0; i<2; i++) {
for (j=0; j<329; j++) {
curV[i][3*j] += (xEyes[i][4*j]*eyeMov[idx][0]+xEyes[i][4*j+1]*eyeMov[idx][1]+xEyes[i][4*j+2]*eyeMov[idx][2]+xEyes[i][4*j+3]*eyeMov[idx][3]);
curV[i][3*j+1] += (yEyes[i][4*j]*eyeMov[idx][0]+yEyes[i][4*j+1]*eyeMov[idx][1]+yEyes[i][4*j+2]*eyeMov[idx][2]+yEyes[i][4*j+3]*eyeMov[idx][3]);
curV[i][3*j+2] += (zEyes[i][4*j]*eyeMov[idx][0]+zEyes[i][4*j+1]*eyeMov[idx][1]+zEyes[i][4*j+2]*eyeMov[idx][2]+zEyes[i][4*j+3]*eyeMov[idx][3]);
}
}
...
}
的值V
,xEyes
,yEyes
,zEyes
并eyeMov
从文件中读取。我遇到的问题是从第二次访问到变化updateBuffers()
的价值V
。但是V
等式左侧的代码中没有任何地方。任何建议如何解决这个问题?
将旧数组的每个属性复制到for循环中的某个新数组
var curV = [];
for (var i=0, vl = V.length; i<vl ; i+=1) {
curV[i] = V[i];
}
如果您需要经常执行此操作,请将其概括为一个函数,该函数将返回array的副本。您还可以使用切片方法,如下所述。
JavaScript知道两种日期类型-基本类型(字符串,布尔值,数字,未定义,空值)和引用类型(对象)。原始类型“保持”其值,引用类型只是“指针”指向内存中的其他位置。当您使用基本类型时,您将使用(恒定大小)值,当您使用引用时,您将使用指针(因为对象大小可能会有所不同)。
这就是为什么您不能直接复制数组。因为您只复制了指针,而不是值。
切片和for循环副本返回浅表副本-任何引用类型都将再次被引用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句