如何链接对象并在三个js中相对移动它们?

如何解决如何链接对象并在三个js中相对移动它们?

我用three.js创建了一个人体模型。

我希望能够:

  1. 链接所有具有父级连接的对象
  2. 相对移动对象(如果移动,则应移动肘部,但如果移动手腕,则不应移动其他部位)

我在下面编写了代码,并以jsfiddle为例。不确定这是否正确。

var scene,camera,renderer,pivot;

//main
init();
animate();

//init
function init() {
  //scene
  scene = new THREE.Scene();
  scene.background = new THREE.Color(0xf0f0f0);

  //camera
  camera = new THREE.PerspectiveCamera(140,window.innerWidth / window.innerHeight,0.1,10000);

  //neck
  var geometry = new THREE.BoxBufferGeometry(2,3,1);
  var material = new THREE.MeshNormalMaterial({
    transparent: true,opacity: 0.5
  });
  var figure = new THREE.Mesh(geometry,material);
  figure.position.set(0,1.5,0);

  //body
  var geometry2 = new THREE.BoxBufferGeometry(0.5,0.5,0.5);
  /* geometry2.rotateZ(THREE.Math.degToRad(90)); // ROTATE GEOMETRY SO IT'S IN THE CORRECT ORIENTATION */
  var figure2 = new THREE.Mesh(geometry2,material);
  figure2.position.set(0,0); // MOVE THE GEOMOETRY UP BY HALF SO PIVOT IS AT THE BOTTOM OF THE GEO
  /* figure2.rotation.set(0,Math.PI / 2); */
  figure.add(figure2);

  //head
  var geometry3 = new THREE.SphereGeometry(0.75,32,32);
  var material3 = new THREE.MeshBasicMaterial({
    color: 0xffff00
  });
  var sphere3 = new THREE.Mesh(geometry3,material3);
  sphere3.position.set(0,2.5,0);
  figure.add(sphere3)

  //right shoulder 
  var geometry4 = new THREE.SphereGeometry(0.25,32);
  var material4 = new THREE.MeshBasicMaterial({
    color: 0xffff00
  });
  var sphere4 = new THREE.Mesh(geometry4,material4);
  sphere4.position.set(1.25,1.25,0);
  figure.add(sphere4)

  //right hand top
  var geometry5 = new THREE.BoxBufferGeometry(0.5,0.5);
  var figure5 = new THREE.Mesh(geometry5,material);
  figure5.position.set(1.25,0.25,0);
  figure.add(figure5);

  //right elbow
  var geometry6 = new THREE.SphereGeometry(0.25,32);
  var sphere6 = new THREE.Mesh(geometry6,material3);
  sphere6.position.set(1.25,-0.75,0);
  figure.add(sphere6)

  //right hand bottom
  var geometry7 = new THREE.BoxBufferGeometry(0.5,0.5);
  var figure7 = new THREE.Mesh(geometry7,material);
  figure7.position.set(1.25,-1.75,0);
  figure.add(figure7);
  
  //right hand bottom sphere
  var geometry8 = new THREE.SphereGeometry(0.25,32);
  var sphere8 = new THREE.Mesh(geometry8,material3);
  sphere8.position.set(1.25,-2.75,0);
  figure.add(sphere8);
  
  //right wrist
  var geometry9 = new THREE.BoxBufferGeometry(0.5,0.5);
  var figure9 = new THREE.Mesh(geometry9,material);
  figure9.position.set(1.25,-3.25,0);
  figure.add(figure9);
  
  //left shoulder 
  var geometry10 = new THREE.SphereGeometry(0.25,32);
  var sphere10 = new THREE.Mesh(geometry10,material4);
  sphere10.position.set(-1.25,0);
  figure.add(sphere10)

  //left hand top
  var geometry11 = new THREE.BoxBufferGeometry(0.5,0.5);
  var figure11 = new THREE.Mesh(geometry11,material);
  figure11.position.set(-1.25,0);
  figure.add(figure11);

  //left elbow
  var geometry12 = new THREE.SphereGeometry(0.25,32);
  var sphere12 = new THREE.Mesh(geometry12,material3);
  sphere12.position.set(-1.25,0);
  figure.add(sphere12)

  //left hand bottom
  var geometry13 = new THREE.BoxBufferGeometry(0.5,0.5);
  var figure13 = new THREE.Mesh(geometry13,material);
  figure13.position.set(-1.25,0);
  figure.add(figure13);
  
  //left hand bottom sphere
  var geometry14 = new THREE.SphereGeometry(0.25,32);
  var sphere14 = new THREE.Mesh(geometry14,material3);
  sphere14.position.set(-1.25,0);
  figure.add(sphere14);
  
  //left wrist
  var geometry15 = new THREE.BoxBufferGeometry(0.5,0.5);
  var figure15 = new THREE.Mesh(geometry15,material);
  figure15.position.set(-1.25,0);
  figure.add(figure15);
  
  //left hip
  var geometry16 = new THREE.SphereGeometry(0.5,32);
  var sphere16 = new THREE.Mesh(geometry16,material3);
  sphere16.position.set(-0.5,-2.25,0);
  figure.add(sphere16);
  
  //left haunch
  var geometry17 = new THREE.BoxBufferGeometry(1,1.75,1);
  var figure17 = new THREE.Mesh(geometry17,material);
  figure17.position.set(-0.5,-3.65,0);
  figure.add(figure17);
  
  //left knee
  var geometry18 = new THREE.SphereGeometry(0.5,32);
  var sphere18 = new THREE.Mesh(geometry18,material3);
  sphere18.position.set(-0.5,-5,0);
  figure.add(sphere18);
  
  //left shin
  var geometry19 = new THREE.BoxBufferGeometry(1,1);
  var figure19 = new THREE.Mesh(geometry19,material);
  figure19.position.set(-0.5,-6.35,0);
  figure.add(figure19);
 
  //left ankle
  var geometry20 = new THREE.SphereGeometry(0.25,32);
  var sphere20 = new THREE.Mesh(geometry20,material3);
  sphere20.position.set(-0.5,-7.5,0);
  figure.add(sphere20);
  
  //left foot
  var geometry21 = new THREE.BoxBufferGeometry(1,1.5);
  var figure21 = new THREE.Mesh(geometry21,material);
  figure21.position.set(-0.5,-7.85,0.25);
  figure.add(figure21);
  
  //right hip
  var geometry22 = new THREE.SphereGeometry(0.5,32);
  var sphere22 = new THREE.Mesh(geometry22,material3);
  sphere22.position.set(0.5,0);
  figure.add(sphere22);
  
  //right haunch
  var geometry23 = new THREE.BoxBufferGeometry(1,1);
  var figure23 = new THREE.Mesh(geometry23,material);
  figure23.position.set(0.5,0);
  figure.add(figure23);

  //right knee
  var geometry24 = new THREE.SphereGeometry(0.5,32);
  var sphere24 = new THREE.Mesh(geometry24,material3);
  sphere24.position.set(0.5,0);
  figure.add(sphere24);
  
  //right shin
  var geometry25 = new THREE.BoxBufferGeometry(1,1);
  var figure25 = new THREE.Mesh(geometry25,material);
  figure25.position.set(0.5,0);
  figure.add(figure25);
 
  //right ankle
  var geometry26 = new THREE.SphereGeometry(0.25,32);
  var sphere26 = new THREE.Mesh(geometry26,material3);
  sphere26.position.set(0.5,0);
  figure.add(sphere26);
  
  //right foot
  var geometry27 = new THREE.BoxBufferGeometry(1,1.5);
  var figure27 = new THREE.Mesh(geometry27,material);
  figure27.position.set(0.5,0.25);
  figure.add(figure27);


  //add figure
  scene.add(figure);

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

  renderer = new THREE.WebGLRenderer({
    antialias: true
  });
  renderer.setSize(window.innerWidth,window.innerHeight);
  document.body.appendChild(renderer.domElement);

  //add grid
  /* scene.add(new THREE.GridHelper(10,20)) */

  camera.position.z = 5;

  //top view on object
  /*  camera.position.set(0,10,0);
   camera.up.set(0,-1);
   camera.lookAt(0,0); */

  //controls to rotate camera
  controls2 = new THREE.OrbitControls(camera,renderer.domElement);
  controls2.minPolarAngle = Math.PI/2;
  controls2.maxPolarAngle = Math.PI/2;

  //controls to drag object in 3d
  /*   var cubePoints = [];
    cubePoints.push(figure2);
    var controls = new THREE.DragControls(cubePoints,renderer.domElement); */

}


//animate
function animate() {
  requestAnimationFrame(animate);

  render();
};

//render
function render() {
  renderer.render(scene,camera);
};

解决方法

要在Three.js中链接网格,我通常使用组(请参见https://threejs.org/docs/#api/en/objects/Group),我还使用它们通过将网格放在所需的枢轴点为一组的组中来更改网格的枢轴点。组的坐标。

当然,您可以为您的案例嵌套组,例如带有手网格的组可以位于另一个具有前臂网格的组内,依此类推。

为了根据手部位置移动肘部位置(如果我说对了),您应该使用Inverse Kinematics,对于Three.js,有https://github.com/jsantell/THREE.IK之类的实现,但我从未使用过我不能告诉你更多有关此事。

希望您能解决您的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <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,添加如下 <property name="dynamic.classpath" value="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['font.sans-serif'] = ['SimHei'] # 能正确显示负号 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 -> 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("/hires") 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<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-