我写了一个代码来动画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
位于等式的左侧。有任何建议如何解决这个问题?
答案 0 :(得分:1)
将旧数组的每个属性复制到for循环中的某个新数组
var curV = [];
for (var i=0, vl = V.length; i<vl ; i+=1) {
curV[i] = V[i];
}
如果您需要经常这样做,请将其概括为一个函数,该函数将返回数组的副本。您也可以使用切片方法,如下所述。
Javascript知道两种日期类型 - 基本类型(字符串,布尔值,数字,未定义,null)和引用类型(对象)。原始类型“保持”它们的值,引用类型只是内存中某些其他位置的“指针”。当你使用原语时,你使用(常量)值,当你使用引用时,你使用指针(因为对象大小可能会有所不同)。
也就是说,为什么你不能直接复制数组。请你只复制指针,而不是值。
Slice和for循环复制返回浅拷贝 - 任何引用类型将再次被引用。
答案 1 :(得分:1)
在Javascript中使用=
复制数组始终是引用。要按值复制数组,应使用方法slice()
,如此页面所示:Create copy of multi-dimensional array, not reference - JavaScript。