Three.js从3个坐标创建人脸

如何解决Three.js从3个坐标创建人脸

我已经准备好使用Vue.jsThree.js创建加载,渲染和显示STL对象的代码。 我想渲染一个新的面孔来代替我当前正在投射的飞机。我已经找到一种方法来获取覆叠(单击)的脸(aVertexbVertexcVertex)的3个顶点。

现在,我想在此位置渲染一个三角形(使用不同的颜色),但是老实说,我不知道该怎么做。我曾尝试使用谷歌搜索,但是还没有运气(我对3d和总体渲染非常陌生)。有人可以朝正确的方向推动我吗?

<template>
  <div id="scene-container" ref="sceneContainer" class="scene-container"></div>
</template>

<script>
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import { STLLoader } from "three/examples/jsm/loaders/STLLoader";

export default {
  name: "HelloWorld",data() {
    return {
      container: null,scene: null,camera: null,controls: null,renderer: null,stats: null,mouse: null,raycaster: null,objName: "testobj",};
  },methods: {
    init() {
      // set container
      this.container = this.$refs.sceneContainer;

      // add raycaster
      this.raycaster = new THREE.Raycaster();
      this.mouse = new THREE.Vector2();
      const onMouseClick = (event) => {
        event.preventDefault();
        // calculate mouse position in normalized device coordinates
        // (-1 to +1) for both components
        this.mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
        this.mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
        // update the picking ray with the camera and mouse position
      };

      window.addEventListener("mousedown",onMouseClick,false);

      // add camera
      const fov = 60; // Field of view
      const aspect = this.container.clientWidth / this.container.clientHeight;
      // const near = 0.1; // the near clipping plane
      // const far = 3000; // the far clipping plane
      const camera = new THREE.PerspectiveCamera(fov,aspect);
      camera.position.set(0,20,75);

      this.camera = camera;

      // create scene
      this.scene = new THREE.Scene();
      this.scene.background = new THREE.Color(0xdddddd);

      // add lights
      const ambientLight = new THREE.HemisphereLight(
        0xffffff,// bright sky color
        0x222222,// dim ground color
        1 // intensity
      );
      const mainLight = new THREE.DirectionalLight(0xffffff,4.0);
      mainLight.position.set(10,10,10);
      this.scene.add(ambientLight,mainLight);

      let hlight = new THREE.AmbientLight(0xffffff,1.3);
      this.scene.add(hlight);

      //Add some point lights to simulate real lights
      let light = new THREE.PointLight(0xffffff,1,1000);
      light.position.set(0,300,500);
      this.scene.add(light);

      // add controls
      this.controls = new OrbitControls(this.camera,this.container);

      // create renderer
      this.renderer = new THREE.WebGLRenderer({ antialias: true });
      this.renderer.setSize(
        this.container.clientWidth,this.container.clientHeight
      );
      this.renderer.setPixelRatio(window.devicePixelRatio);
      this.renderer.gammaFactor = 2.2;
      this.renderer.outputEncoding = THREE.sRGBEncoding;
      this.renderer.physicallyCorrectLights = true;
      document
        .getElementById("scene-container")
        .appendChild(this.renderer.domElement);

      // set aspect ratio to match the new browser window aspect ratio
      this.camera.aspect =
        this.container.clientWidth / this.container.clientHeight;
      this.camera.updateProjectionMatrix();
      this.renderer.setSize(
        this.container.clientWidth,this.container.clientHeight
      );
      let me = this;
      let loader = new STLLoader();
      let mesh = new THREE.Object3D();
      loader.load("/three-assets/RobotExpressive.stl",function (geometry) {
        // console.log(geometry);
        let material = new THREE.MeshLambertMaterial({
          color: 0x1313,wireframe: false,transparent: false,vertexColors: false,});
        mesh = new THREE.Mesh(geometry,material);
        mesh.rotation.x = -0.5 * Math.PI;
        mesh.position.set(0,0);
        mesh.name = me.objName;
        me.scene.add(mesh);
      });

      window.addEventListener("resize",onWindowResize,false);

      function onWindowResize() {
        me.camera.aspect = window.innerWidth / window.innerHeight;
        me.camera.updateProjectionMatrix();

        me.renderer.setSize(window.innerWidth,window.innerHeight);
      }

      this.renderer.setAnimationLoop(() => {
        this.render();
      });
    },render() {
      this.raycaster.setFromCamera(this.mouse,this.camera);
      this.intersects = this.raycaster.intersectObjects(this.scene.children);

      // window.addEventListener( 'mousemove',onMouseMove,false );
      if (this.intersects.length > 1) {
        // this.intersects[0].object.material.color.set(0xff);
        for (let i = 0; i < this.intersects.length; i++) {
          if (this.intersects[i].object.name == "testobj") {
            let positionAttribute = this.intersects[i].object.geometry
              .attributes["position"];
            let intersection = this.intersects[i];
            let aVertex = new THREE.Vector3(
              positionAttribute.getX(intersection.face.a),positionAttribute.getY(intersection.face.a),positionAttribute.getZ(intersection.face.a)
            );
            let bVertex = new THREE.Vector3(
              positionAttribute.getX(intersection.face.b),positionAttribute.getY(intersection.face.b),positionAttribute.getZ(intersection.face.b)
            );
            let cVertex = new THREE.Vector3(
              positionAttribute.getX(intersection.face.c),positionAttribute.getY(intersection.face.c),positionAttribute.getZ(intersection.face.c)
            );

            console.log(aVertex,bVertex,cVertex);
          }
        }
      }
      this.renderer.render(this.scene,this.camera);
    },},mounted() {
    this.init();
  },};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
#scene-container {
  height: 99.8%;
}
</style>

解决方法

示例(用于使用BufferGeometry拾取网格)

// initital setup:
let lineGeometry = new THREE.BufferGeometry();
let linePositionAttribute = new THREE.BufferAttribute(new Float32Array(4 * 3),3);
lineGeometry.addAttribute('position',linePositionAttribute);
let lineMaterial = new THREE.LineBasicMaterial(
{
    color: 0xff0000
});
var intersectionFaceEdge = new THREE.Line(lineGeometry,lineMaterial);      
scene.add(intersectionFaceEdge);    
        
// ... on each raycasting:

let face = intersection.face;
let obj = intersection.object;  

let positionAttribute = obj.geometry.attributes['position'];
        
linePositionAttribute.copyAt(0,positionAttribute,face.a);
linePositionAttribute.copyAt(1,face.b);
linePositionAttribute.copyAt(2,face.c);
linePositionAttribute.copyAt(3,face.a); 

lineGeometry.applyMatrix(obj.matrixWorld);

我建议使用GPU选择而不是简单的光线投射

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-