我有以下代码:
Application
var otherCubesLoc = projectCubeLoc [j];生成错误
var images = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg", "image5.jpg", "image6.jpg", "image7.jpg", "image8.jpg"];
var objects = [];
var geometry;
while(objects.length < images.length) {
var imagesIndex = 0;
var object = [
texture1 = textureLoader.load( "data/"+ images[imagesIndex] ),
material1 = new THREE.MeshBasicMaterial( { map: texture1 } ),
objectMesh = new THREE.Mesh( geometry, material1 ),
location3d = new THREE.Vector3( Math.random()* 500-250, Math.random()* 500-250, Math.random()* 500+120 )
];
var overlapping = false;
for (var j = 0; j < objects.length; j++) {
var projectCubeLoc = objects[j][0][3];
将语句放在for循环之外,因为重叠是false,至少有一个对象将被放入数组中
var otherCubesLoc = projectCubeLoc[j];
var distance = projectCubeLoc.distanceTo( otherCubesLoc );
console.log(distance);
if (distance < 150) {
overlapping = true;
break;
};
};
但现在我得到TypeError:无法读取属性&#39; 0&#39;未定义的
当我在浏览器中运行此代码时,浏览器崩溃...我没有收到任何错误消息,浏览器将崩溃并自行退出... 我认为它与while循环有关但我无法弄清楚出了什么问题......
非常感谢任何帮助或提示!
如果需要更多代码,或者如果您想查看jsfiddle,请询问:)
答案 0 :(得分:0)
您没有为对象数组分配任何内容。
你的代码永远不会在你的for循环中到达你的objects.push。
您将数组初始化为空,因此当它到达for for look j == 0
和objects.length == 0
时,循环就不会运行。
答案 1 :(得分:0)
我不确定你是否正在使用Unity3d但是当我尝试执行这样的C#代码时,它发生在我身上。 实际上你在循环中声明一个变量,每次更新它总是将该变量的值设置为零,使其成为一个网格。
答案 2 :(得分:0)
while(objects.length < images.length)
循环开始时,你有
空数组,最初会传递,因为这个时间长度为
objects
少于图像数组。object
应该被推送或添加到objects
(我的假设
根据命名)。然后你for (var j = 0; j <objects.length; j++)
启动for循环,这是使用
长度objects
,尚未初始化。在里面
整体功能。所以它永远不会进入循环没有任何值被推入objects
数组变量,而这又变为描述的第1点,并且会在函数中形成无限循环,从而导致浏览器崩溃。
描述:当fucntion开始执行时,'对象'的长度为0并且它的长度小于图像的长度,这是一个有效的条件,但是当fucntion执行内部循环时,那个时间长度变量'objects'的变量也为零,因为您没有在对象中添加值。那个时候objects.length是0.所以for循环没有执行,再次检查条件,此时'对象'的长度也是零,有效的场景再次执行我前面描述的所有代码行,仍为循环因为在执行循环之前没有将值添加到变量'objects'中,所以不会进行调整。并且相同的场景运行无限。希望这能清除你所有的疑惑。
答案 3 :(得分:0)
var images = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg", "image5.jpg", "image6.jpg", "image7.jpg", "image8.jpg"];
var objects = [];
geometry = new THREE.BoxGeometry( 100, 100, 100,10,10 );
while(objects.length < images.length) {
var imagesIndex = 0;
var object = {};
object.texture1 = textureLoader.load( "data/"+ images[imagesIndex] );
object.material1 = new THREE.MeshBasicMaterial( { map: object.texture1 } );
object.objectMesh = new THREE.Mesh( geometry, object.material1 );
object.location3d = new THREE.Vector3( Math.random()* 500-250, Math.random()* 500-250, Math.random()* 500+120 );
var overlapping = false;
for (var j = 0; j < objects.length; j++) {
var projectCubeLoc = objects[j].location3d;
var distance = projectCubeLoc.distanceTo( object.location3d );
if (distance < 150) {
overlapping = true;
break;
};
};
if (!overlapping) {
objects.push(object);
imagesIndex++;
object.objectMesh.position = object.location3d;
console.log(object.location3d);
scene.add(object.objectMesh);
};
};
console.log(objects);
我用一个名为object的对象替换了对象数组。这样我就可以从对象中获取数组中所需的数据,而不必处理0个未定义的错误。现在效果很好;)感谢所有的帮助@Asad Jamil希望这将有助于未来的任何人:)