BoxGeometry 未与 SphereGeometry 正确对齐

Posted

技术标签:

【中文标题】BoxGeometry 未与 SphereGeometry 正确对齐【英文标题】:BoxGeometry not aligning with SphereGeometry properly 【发布时间】:2016-12-22 04:26:48 【问题描述】:

我正在尝试在地球上创建尖峰(球体几何)。尽管一切正常,但尖峰与地球不对齐。我希望尖峰对齐如下图所示的内容。但我的尖峰不lookAt(new THREE.Vector3(0,0,0)) 尽管提到。请帮帮我。

我特意提到了调试所需的代码。如果您需要更多代码,请告诉我。下图是我希望我的尖峰与球体对齐的方式。

但这就是它的样子

我的 Main JS 初始化文件。

$(document).ready(function () 

  // Initializing Camera
  Influx.Camera = new Influx.Camera(
    fov: 60,
    aspectRatio: window.innerWidth / window.innerHeight,
    near: 1,
    far: 1000,
    position: 
      x: 0,
      y: 0,
      z: 750
    
  );

  //Initializing Scene
  Influx.Scene = new Influx.Scene();

  // Initializing renderer
  Influx.Renderer = new Influx.Renderer(
    clearColor: 0x000000,
    size: 
      width: window.innerWidth,
      height: window.innerHeight
    
  );

  Influx.Globe  = new Influx.Globe(
    radius: 300,
    width:  50,
    height: 50
  );

  //
  Influx.Stars  = new Influx.Stars(
    particleCount: 15000,
    particle: 
      color: 0xFFFFFF,
      size: 1
    
  );

  Influx.moveTracker = new Influx.moveTracker();

  Influx.EventListener  = new Influx.EventListener();

  (function animate() 
    requestAnimationFrame( animate );
    render();
    controls.update();
  )();

  function render() 
    camera.lookAt(scene.position);
    group.rotation.y -= 0.001;
    renderer.render( scene, camera );
  ;

);

以下是负责在 Globe 上生成尖峰的代码。

Influx.Spikes = function (lat, long) 

  // convert the positions from a lat, lon to a position on a sphere.
  var latLongToVector3 = function(lat, lon, RADIUS, heigth) 
    var phi   = (lat) * Math.PI/180,
        theta = (lon-180) * Math.PI/180;

    var x = -(RADIUS+heigth) * Math.cos(phi) * Math.cos(theta),
        y =  (RADIUS+heigth) * Math.sin(phi),
        z =  (RADIUS+heigth) * Math.cos(phi) * Math.sin(theta);

    return new THREE.Vector3(x, y, z);
  ;

  var geom        = new THREE.Geometry();
  var BoxGeometry = new THREE.BoxGeometry(1, 100, 1);

  //iterates through the data points and makes boxes with the coordinates
  var position = latLongToVector3(lat, long, 300, 2);

  var box = new THREE.Mesh( BoxGeometry );

  //each position axis needs to be set separately, otherwise the box
  //will instantiate at (0,0,0)
  box.position.x = position.x;
  box.position.y = position.y;
  box.position.z = position.z;

  box.lookAt(new THREE.Vector3(0, 0, 0));
  box.updateMatrix();

  //merges the geometry to speed up rendering time, don't use THREE.GeometryUtils.merge because it's deprecated
  geom.merge(box.geometry, box.matrix);

  var total = new THREE.Mesh(geom, new THREE.MeshBasicMaterial(
    color: getRandomColor(),
    morphTargets: true
  ));

  function getRandomColor() 
    var letters = '0123456789ABCDEF';
    var color = '#';
    for (var i = 0; i < 6; i++ ) 
      color += letters[Math.floor(Math.random() * 16)];
    
    return color;
  ;

  //add boxes to the group
  group.add(total);
  scene.add(group);
;

Influx.Camera = function(params = ) 

  if ( !$.isEmptyObject(params) ) 
    window.camera = new THREE.PerspectiveCamera(params.fov, params.aspectRatio, params.near, params.far);
    camera.position.set(params.position.x, params.position.y, params.position.z);
    camera.lookAt(new THREE.Vector3(0,0,0));
   else 
    console.log("Trouble with Initializing Camera");
    return;
  

;

【问题讨论】:

嗨,Rahul,您能否更好地解释一下您的意思:“但尖峰与地球不对齐”。我在图像上看不出任何问题。顺便说一句,它看起来很酷! 嘿@juagicre 我用我如何获得尖峰的图片编辑了我的问题。那些没有与球体对齐..即lookAt(new THREE.Vector3(0,0,0)应该完成这项工作 【参考方案1】:

记住,lookAt 需要一个direction vector,你给这个方法一个向量 (0, 0, 0),这实际上不是一个归一化的方向向量。所以你必须计算方向:

从你的盒子位置到球体的中心并对其进行标准化。

var dir = box.position.sub(world.position).normalize();
box.lookAt(dir);

现在只是一组可以帮助您的代码良好约定:

var BoxGeometry = new THREE.BoxGeometry(1, 100, 1);

在这里,我宁愿为盒子几何图形使用另一个 var 名称,而不是与 THREE 中的“类”定义混淆并遵循命名约定:

var boxGeometry = new THREE.BoxGeometry(1, 100, 1);

这里:

box.position.x = position.x;
box.position.y = position.y;
box.position.z = position.z;

你可以设置:

box.position.copy(position);

【讨论】:

嘿juagicre,我们在哪里使用var dir 在代码中? box.lookAt(dir);而不是 box.lookAt(new THREE.Vector3(0,0,0));我猜球体/世界位置的中心是 (0,0,0) 但lookAt 方法不采用位置而是方向向量,因此您必须执行此操作。也许你必须否定方向,试试看;) 我得到相同的方向.. 如果我删除 box.updateMatrix 我也没有得到 boxGeometry 显示 如果您想获得帮助,请提供更多反馈...您获得了哪些 dir 值?它会改变所有盒子的方向吗?你能尝试删除“box.updateMatrix();”吗而不是合并它?您也可以尝试将硬编码值设置为 dir 向量,例如 (1,1,1).normalize(),最后这是盒子应该查看的方向。在此之后检查盒子的旋转是否发生了变化。最后一个问题,盒子类型是object3d吗?因为THREE.Mesh没有方法lookAt... 有`var dir = new THREE.Vector3(1,1,1).normalize(); box.lookAt(dir);` 改变了方向......正如我的问题(代码)中提到的那样,盒子类型是new THREE.BoxGeometry(1, 100, 1); ..【参考方案2】:

我也遇到这个问题,已经解决了,解决方法是:box.lookAt(new THREE.Vector3(0, 0, 0)) 必须在box.scale.z = xxxx之后

【讨论】:

在这种情况下xxxx 是什么?

以上是关于BoxGeometry 未与 SphereGeometry 正确对齐的主要内容,如果未能解决你的问题,请参考以下文章

Three.js中的CubeGeometry VS BoxGeometry?

SKPhysicsBody 未与 SKShapeNode 对齐

片段 XXX 未与片段管理器关联

CKEditor 未与 easyadmin 集成显示

颤振行未与左侧对齐

Textarea 值未与表单一起发布