Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js 如何将二维几何图形覆盖在三维长方体上并固定其相对位置w.r.t长方体图像_Three.js - Fatal编程技术网

Three.js 如何将二维几何图形覆盖在三维长方体上并固定其相对位置w.r.t长方体图像

Three.js 如何将二维几何图形覆盖在三维长方体上并固定其相对位置w.r.t长方体图像,three.js,Three.js,我想将一个三角形led(2d几何体)覆盖在一个长方体几何体上,长方体几何体的侧面使用纹理图像进行渲染。使用轨道控制旋转场景时,三角形led应保持在其原始位置,始终覆盖方框上的三角形灰色空间 这就是我所做的,但我无法达到预期的结果 <script type="text/javascript"> window.onload = function() { var count = 0; var azimuthalAngle = 0; const

我想将一个三角形led(2d几何体)覆盖在一个长方体几何体上,长方体几何体的侧面使用纹理图像进行渲染。使用轨道控制旋转场景时,三角形led应保持在其原始位置,始终覆盖方框上的三角形灰色空间

这就是我所做的,但我无法达到预期的结果

<script type="text/javascript">

  window.onload = function() {


  var count = 0;
  var azimuthalAngle = 0;
  
  const canvas = document.querySelector('#chassis');
  const overlay = document.querySelector('#overlay');

  // Create the renderer and add it to the page's body element
  const renderer = new THREE.WebGLRenderer({canvas: canvas, alpha: true, antialias: true});
  renderer.setPixelRatio( window.devicePixelRatio );
  renderer.setSize( window.innerWidth, window.innerHeight );
  renderer.sortObjects = false;

  // Create the scene to hold the object
  var scene = new THREE.Scene();

  // Create the camera
  var camera = new THREE.PerspectiveCamera(
    40,                                    // Field of view
    window.innerWidth/window.innerHeight,  // Aspect ratio
    10,                                    // Near plane distance
    1000                                   // Far plane distance
  );

  // Position the camera
  camera.position.set( 0, 0, 25);
  scene.add( camera );

  // Add the lights
  var light = new THREE.PointLight( 0xeaeaea, .35);
  light.position.set( 10, 10, 10 );
  scene.add( light );

  ambientLight = new THREE.AmbientLight( 0xffffff );
  scene.add( ambientLight );

  // Load the textures (chassis images)
  var textureLoader = new THREE.TextureLoader();
  var chassisCoverTexture = textureLoader.load( 'Front.png' );
  var chassisSpineTexture = textureLoader.load( 'side.png' );
  var chassisBackTexture = textureLoader.load( 'Back.png' );
  var chassisPagesTexture = textureLoader.load( 'side.png' );
  var chassisPagesTopBottomTexture = textureLoader.load( 'topbottom.png' );


  // Use the linear filter for the textures to avoid blurriness
  chassisCoverTexture.minFilter
    = chassisSpineTexture.minFilter
    = chassisBackTexture.minFilter
    = chassisPagesTexture.minFilter
    = chassisPagesTopBottomTexture.minFilter
    = THREE.LinearFilter;

  // Create the materials
  var chassisCover = new THREE.MeshLambertMaterial( { color: 0xffffff, transparent: false, map: chassisCoverTexture } );
  var chassisSpine = new THREE.MeshLambertMaterial( { color: 0xffffff, map: chassisSpineTexture } );
  var chassisBack = new THREE.MeshLambertMaterial( { color: 0xffffff, map: chassisBackTexture } );
  var chassisPages = new THREE.MeshLambertMaterial( { color: 0xffffff, map: chassisPagesTexture } );
  var chassisPagesTopBottom = new THREE.MeshLambertMaterial( { color: 0xffffff, map: chassisPagesTopBottomTexture } );

  var materials = [
    chassisPages,          // Right side
    chassisSpine,          // Left side
    chassisPagesTopBottom, // Top side
    chassisPagesTopBottom, // Bottom side
    chassisCover,          // Front side
    chassisBack            // Back side
  ];

  // Create the chassis and add it to the scene
  var chassis = new THREE.Mesh( new THREE.BoxGeometry( 20, 2, 10, 0, 0, 0 ), materials );

  // Create the orbit controls for the camera
  controls = new THREE.OrbitControls( camera, renderer.domElement );
  controls.addEventListener('change', shift);
  controls.enableDamping = true;
  controls.dampingFactor = 0.5;
  controls.enablePan = false;
  controls.enableZoom = false;
  controls.minPolarAngle = Math.PI/2;
  controls.maxPolarAngle = Math.PI/2;

  var geometry = new THREE.Geometry();
  geometry.vertices.push(
      new THREE.Vector3( -0.1175, -0.745, 0 ),
      new THREE.Vector3( -0.235, -0.93, 0 ),
      new THREE.Vector3(  0, -0.93, 0 )
  );

  var face = new THREE.Face3(0, 1, 2);
  geometry.faces.push(face);
  var material = new THREE.MeshPhongMaterial({color: 0xff0000, depthTest: false});
  var triangle = new THREE.Mesh(geometry, material);

  var group = new THREE.Group(); 
  group.add( chassis ); 
  group.add( triangle ); 
  scene.add( group );

  scene.add(new THREE.AxesHelper(4));

  console.log("Angle: " + controls.getAzimuthalAngle());
  
  function shift() {
    triangle.position.x = 0.217047*Math.cos(controls.getAzimuthalAngle());
    triangle.position.z = 0.217047*Math.sin(controls.getAzimuthalAngle());
    console.log("X: " + controls.getAzimuthalAngle());
  }

  // Begin the animation
  animate();

  /* Animate a frame */
  function animate(time) {
    
    // Update the orbit controls
    controls.update();

    // Render the frame
    renderer.render( scene, camera );
    
    //(count % 10 == 0) ? material.setValues({color:0xdbdbdb}) : material.setValues({color:0xff0000});
    //count = (count != 1000) ? count+1 : 0;

    // Keep the animation going
    requestAnimationFrame( animate );
  }
}

</script>

window.onload=函数(){
var计数=0;
var方位角=0;
const canvas=document.querySelector(“#机箱”);
const overlay=document.querySelector(“#overlay”);
//创建渲染器并将其添加到页面的body元素中
const renderer=new THREE.WebGLRenderer({canvas:canvas,alpha:true,antialas:true});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth、window.innerHeight);
renderer.sortObjects=false;
//创建场景以容纳对象
var scene=new THREE.scene();
//创建摄影机
var摄像机=新的三视角摄像机(
40,//视野
window.innerWidth/window.innerHeight,//纵横比
10,//近平面距离
1000//远平面距离
);
//把相机放好
摄像机位置设置(0,0,25);
场景。添加(摄影机);
//加灯
var灯=新的三点灯(0xEAEA,.35);
光。位置。设置(10,10,10);
场景。添加(灯光);
环境光=新的三个环境光(0xffffff);
场景。添加(环境光);
//加载纹理(机箱图像)
var textureLoader=new THREE.textureLoader();
var chassisCoverTexture=textureLoader.load('Front.png');
var chassissspineTexture=textureLoader.load('side.png');
var chassisBackTexture=textureLoader.load('Back.png');
var chassisPagesTexture=textureLoader.load('side.png');
var chassisPagesTopBottomTexture=textureLoader.load('topbottom.png');
//对纹理使用线性过滤器以避免模糊
chassisCoverTexture.minFilter
=chassisSpineTexture.minFilter
=chassisBackTexture.minFilter
=chassisPagesTexture.minFilter
=chassisPagesTopBottomTexture.minFilter
=三个线性过滤器;
//创建材质
var chassisCover=new THREE.MeshLambertMaterial({color:0xffffff,transparent:false,map:chassisCoverTexture});
var chassissspine=new THREE.MeshLambertMaterial({color:0xffffff,map:chassissspineTexture});
var chassisBack=new THREE.MeshLambertMaterial({color:0xffffff,map:chassisBackTexture});
var chassisPages=new THREE.MeshLambertMaterial({color:0xffffff,map:chassisPagesTexture});
var chassisPagesTopBottom=new THREE.MeshLambertMaterial({color:0xffffff,map:chassisPagesTopBottomTexture});
var材料=[
chassisPages,//右侧
ChassissSpine,//左侧
chassisPagesTopBottom,//顶部
chassisPagesTopBottom,//底侧
底盘盖,//正面
chassisBack//背面
];
//创建机箱并将其添加到场景中
var机箱=新的3.Mesh(新的3.BoxGeometry(20,2,10,0,0,0),材质);
//为摄影机创建动态观察控件
控件=新的三个.轨道控件(摄影机、渲染器.doElement);
控件。addEventListener('change',shift);
controls.enableDamping=true;
控制。阻尼系数=0.5;
controls.enablePan=false;
controls.enableZoom=false;
controls.minPolarAngle=Math.PI/2;
controls.maxPolarAngle=Math.PI/2;
var geometry=new THREE.geometry();
geometry.vertices.push(
新三矢量3(-0.1175,-0.745,0),
新三矢量3(-0.235,-0.93,0),
新三矢量3(0,-0.93,0)
);
变量面=新的三个面3(0,1,2);
几何。面。推(面);
var material=new THREE.MeshPhongMaterial({color:0xff0000,depthTest:false});
var三角形=新的三个网格(几何体、材质);
var group=新的三个.group();
添加组(机箱);
组。添加(三角形);
场景。添加(组);
场景。添加(新的三个。AxeHelper(4));
log(“角度:+controls.getAzimuthalAngle());
函数移位(){
triangle.position.x=0.217047*Math.cos(controls.getAzimuthalAngle());
triangle.position.z=0.217047*Math.sin(controls.getAzimuthalAngle());
log(“X:+controls.getAzimuthalAngle());
}
//开始动画
制作动画();
/*为一帧设置动画*/
函数动画(时间){
//更新轨道控制
控件更新();
//渲染帧
渲染器。渲染(场景、摄影机);
//(计数%10==0)?material.setValues({color:0xdbdb}):material.setValues({color:0xff0000});
//计数=(计数!=1000)?计数+1:0;
//继续播放动画
请求动画帧(动画);
}
}