new CCDIKSolver( OOI.kira, iks ); // 创建逆运动学求解器

2024-05-30 10:54

本文主要是介绍new CCDIKSolver( OOI.kira, iks ); // 创建逆运动学求解器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

demo案例
在这里插入图片描述

new CCDIKSolver(OOI.kira, iks); 在使用某个特定的库或框架来创建一个逆运动学(Inverse Kinematics, IK)求解器实例。逆运动学在机器人学、动画和计算机图形学等领域中非常重要,它用于根据期望的末端执行器(如机器人的手或动画角色的脚)的位置和方向来求解关节的角度。

不过,由于 CCDIKSolverOOI.kiraiks 都不是标准库或广泛认可的API的一部分,我将基于一般的逆运动学求解器和您提供的代码片段来解释。

入参 (Parameters)

  1. OOI.kira

    • 代表机器人或动画角色的对象OOI,而 kira 这个对象包含有关机器人或角色的关节结构、关节限制等信息。
  2. iks

    • 这个参数的具体含义取决于 CCDIKSolver 的设计。但一般来说,它可能包含有关逆运动学问题的信息,如末端执行器的目标位置、方向或其他约束条件。

出参 (Return Value)

  • 代码片段 new CCDIKSolver(OOI.kira, iks); 创建了一个新的 CCDIKSolver 实例,并返回该实例的引用。这个实例可以用来求解逆运动学问题,即给定末端执行器的目标位置和约束条件,计算出关节的角度。

方法 (Methods)

  • 由于 CCDIKSolver 不是标准库的一部分,具体的方法将取决于该类的设计。但一般来说,你可能会看到以下类型的方法:
    • solve():用于求解逆运动学问题,并返回关节角度的解。
    • updateTarget():用于更新末端执行器的目标位置或方向。
    • getJointAngles():用于获取求解得到的关节角度。

属性 (Properties)

  • 类似地,具体的属性将取决于 CCDIKSolver 类的设计。但以下是一些常见的属性:
    • targetPosition:代表末端执行器的目标位置。
    • targetOrientation:代表末端执行器的目标方向。
    • jointAngles:存储求解得到的关节角度。
    • status:表示求解器的状态(如“正在求解”、“已解决”或“无解”等)。
    • :其他可能的属性,如关节限制、错误信息等。
<!DOCTYPE html>
<html lang="en"><head><title>three.js webgl - animation - skinning - ik</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"><meta name="author" content="Antoine BERNIER (abernier)" /><link type="text/css" rel="stylesheet" href="main.css"><style>body {color:white;}#info a {color:#4d6675;}</style></head><body><div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - webgl - inverse kinematics<br />Character model by <a href="https://assetstore.unity.com/packages/3d/characters/humanoids/humans/kira-lowpoly-character-100303" target="_blank" rel="noopener">Aki</a>, furnitures from <a href="https://poly.pizza" target="_blank" rel="noopener">poly.pizza</a>, scene by <a href="https://abernier.name/three.js/examples/webgl_esher.html" target="_blank" rel="noopener">abernier</a>. CC0.</div><script type="importmap">{"imports": {"three": "../build/three.module.js","three/addons/": "./jsm/"}}</script><script type="module">// 导入所需的模块import * as THREE from 'three';import { OrbitControls } from 'three/addons/controls/OrbitControls.js';import { TransformControls } from 'three/addons/controls/TransformControls.js';import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';import { CCDIKSolver, CCDIKHelper } from './jsm/animation/CCDIKSolver.js';import Stats from 'three/addons/libs/stats.module.js';import { GUI } from 'three/addons/libs/lil-gui.module.min.js';let scene, camera, renderer, orbitControls, transformControls;let mirrorSphereCamera;const OOI = {};let IKSolver;let stats, gui, conf;const v0 = new THREE.Vector3();// 初始化函数init().then( animate );async function init() {// 配置参数conf = {followSphere: false,turnHead: true,ik_solver: true,update: updateIK};scene = new THREE.Scene(); // 创建场景scene.fog = new THREE.FogExp2( 0xffffff, .17 ); // 添加雾效scene.background = new THREE.Color( 0xffffff ); // 设置背景色camera = new THREE.PerspectiveCamera( 55, window.innerWidth / window.innerHeight, 0.001, 5000 ); // 创建透视相机camera.position.set( 0.9728517749133652, 1.1044765132727201, 0.7316689528482836 ); // 设置相机位置camera.lookAt( scene.position ); // 设置相机朝向const ambientLight = new THREE.AmbientLight( 0xffffff, 8 ); // 创建环境光scene.add( ambientLight ); // 将环境光添加到场景中renderer = new THREE.WebGLRenderer( { antialias: true, logarithmicDepthBuffer: true } ); // 创建WebGL渲染器renderer.setPixelRatio( window.devicePixelRatio ); // 设置像素比例renderer.setSize( window.innerWidth, window.innerHeight ); // 设置渲染器尺寸document.body.appendChild( renderer.domElement ); // 将渲染器元素添加到body中stats = new Stats(); // 创建性能统计对象document.body.appendChild( stats.dom ); // 将性能统计元素添加到body中orbitControls = new OrbitControls( camera, renderer.domElement ); // 创建轨道控制器orbitControls.minDistance = 0.2; // 设置轨道控制器最小距离orbitControls.maxDistance = 1.5; // 设置轨道控制器最大距离orbitControls.enableDamping = true; // 启用阻尼效果const dracoLoader = new DRACOLoader(); // 创建DRACO加载器dracoLoader.setDecoderPath( 'jsm/libs/draco/' ); // 设置DRACO解码器路径const gltfLoader = new GLTFLoader(); // 创建GLTF加载器gltfLoader.setDRACOLoader( dracoLoader ); // 设置GLTF加载器的DRACO加载器const gltf = await gltfLoader.loadAsync( 'models/gltf/kira.glb' ); // 异步加载GLTF模型gltf.scene.traverse( n => {// 遍历模型场景if ( n.name === 'head' ) OOI.head = n;if ( n.name === 'lowerarm_l' ) OOI.lowerarm_l = n;if ( n.name === 'Upperarm_l' ) OOI.Upperarm_l = n;if ( n.name === 'hand_l' ) OOI.hand_l = n;if ( n.name === 'target_hand_l' ) OOI.target_hand_l = n;if ( n.name === 'boule' ) OOI.sphere = n;if ( n.name === 'Kira_Shirt_left' ) OOI.kira = n;} );scene.add( gltf.scene ); // 将GLTF场景添加到场景中orbitControls.target.copy( OOI.sphere.position ); // 轨道控制器以球体为焦点OOI.hand_l.attach( OOI.sphere ); // 将手臂附加到球体上// 创建镜像球体相机const cubeRenderTarget = new THREE.WebGLCubeRenderTarget( 1024 );mirrorSphereCamera = new THREE.CubeCamera( 0.05, 50, cubeRenderTarget );scene.add( mirrorSphereCamera );const mirrorSphereMaterial = new THREE.MeshBasicMaterial( { envMap: cubeRenderTarget.texture } );OOI.sphere.material = mirrorSphereMaterial;transformControls = new TransformControls( camera,renderer.domElement ); // 创建变换控制器transformControls.size = 0.75; // 设置控制器大小transformControls.showX = false; // 隐藏X轴transformControls.space = 'world'; // 设置变换空间transformControls.attach( OOI.target_hand_l ); // 将控制器附加到目标手臂上scene.add( transformControls ); // 将控制器添加到场景中// 使用变换控制器时禁用轨道控制器transformControls.addEventListener( 'mouseDown', () => orbitControls.enabled = false );transformControls.addEventListener( 'mouseUp', () => orbitControls.enabled = true );// 将第一个骨骼添加到模型上OOI.kira.add( OOI.kira.skeleton.bones[ 0 ] );// 定义逆运动学参数const iks = [{target: 22, // "target_hand_l"effector: 6, // "hand_l"links: [{index: 5, // "lowerarm_l"rotationMin: new THREE.Vector3( 1.2, - 1.8, - .4 ),rotationMax: new THREE.Vector3( 1.7, - 1.1, .3 )},{index: 4, // "Upperarm_l"rotationMin: new THREE.Vector3( 0.1, - 0.7, - 1.8 ),rotationMax: new THREE.Vector3( 1.1, 0, - 1.4 )},],}];IKSolver = new CCDIKSolver( OOI.kira, iks ); // 创建逆运动学求解器const ccdikhelper = new CCDIKHelper( OOI.kira, iks, 0.01 ); // 创建逆运动学帮助器scene.add( ccdikhelper ); // 将逆运动学帮助器添加到场景中gui = new GUI(); // 创建GUIgui.add( conf, 'followSphere' ).name( 'follow sphere' ); // 添加跟随球体的控制项gui.add( conf, 'turnHead' ).name( 'turn head' ); // 添加转动头部的控制项gui.add( conf, 'ik_solver' ).name( 'IK auto update' ); // 添加逆运动学自动更新的控制项gui.add( conf, 'update' ).name( 'IK manual update()' ); // 添加手动更新逆运动学的控制项gui.open(); // 默认打开GUIwindow.addEventListener( 'resize', onWindowResize, false ); // 监听窗口大小变化事件}function animate( ) {// 更新镜像球体相机位置和渲染if ( OOI.sphere && mirrorSphereCamera ) {OOI.sphere.visible = false;OOI.sphere.getWorldPosition( mirrorSphereCamera.position );mirrorSphereCamera.update( renderer, scene );OOI.sphere.visible = true;}// 如果设置了跟随球体,轨道控制器将跟随球体位置if ( OOI.sphere && conf.followSphere ) {OOI.sphere.getWorldPosition( v0 );orbitControls.target.lerp( v0, 0.1 );}// 如果设置了转动头部,头部朝向球体if ( OOI.head && OOI.sphere && conf.turnHead ) {OOI.sphere.getWorldPosition( v0 );OOI.head.lookAt( v0 );OOI.head.rotation.set( OOI.head.rotation.x, OOI.head.rotation.y + Math.PI, OOI.head.rotation.z );}// 如果设置了逆运动学自动更新,更新逆运动学if ( conf.ik_solver ) {updateIK();}orbitControls.update(); // 更新轨道控制器renderer.render( scene, camera ); // 渲染场景stats.update(); // 更新性能统计requestAnimationFrame( animate ); // 请求下一帧动画}function updateIK() {// 更新逆运动学if ( IKSolver ) IKSolver.update();scene.traverse( function ( object ) {// 遍历场景中的对象if ( object.isSkinnedMesh ) object.computeBoundingSphere();} );}function onWindowResize() {// 窗口大小变化事件处理函数camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize( window.innerWidth, window.innerHeight );}</script></body>
</html>

本内容来源于小豆包,想要更多内容请跳转小豆包 》

这篇关于new CCDIKSolver( OOI.kira, iks ); // 创建逆运动学求解器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016159

相关文章

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

PHP7扩展开发之类的创建

本篇文章主要将如何在扩展中创建一个对象。创建的对象的过程,其实和一个小孩出生,成长的过程有些类似。 第一步,办准生证 生孩子第一步,先办准生证。声明我要生孩子了。对象创建的时候,如何办准生证呢?只要定义一个zend_class_entry变量即可。代码如下: zend_class_entry ce; zend_class_entry 是啥?可以认为它使一个原型,定义了一些对象应该有哪些东西