元宇宙虚拟空间的角色初始化(六)

前言

该文章主要讲元宇宙虚拟空间的角色初始化,基本核心技术点,不多说,直接引入正题。


角色初始化

在调用渲染前,打印一下更新的列表

console.log(this.updatables);       

this.render(this);;

这里看到有很多要更新的

这里我们来看一下角色Character的更新,首先是在CharacterSpawnPoint载入人物的模型,通过Character类对角色模型进行一个初始化

public spawn(loadingManager: LoadingManager, world: World): void {                            loadingManager.loadGLTF('build/assets/boxman.glb', (model) => {       let player = new Character(model);                     let worldPos = new THREE.Vector3();this.object.getWorldPosition(worldPos);player.setPosition(worldPos.x, worldPos.y, worldPos.z);                let forward = Utils.getForward(this.object);player.setOrientation(forward, true);      world.add(player);           player.takeControl();        });    }

Character初始化的内容,

constructor(gltf: any){//继承了THREE.Object3Dsuper();//根据模型动画数据设置动画this.readCharacterData(gltf);this.setAnimations(gltf.animations);//创建一个组方便管理和控制角色,THREE.Object3D是可以加入一个组的this.tiltContainer = new THREE.Group();this.add(this.tiltContainer);//在嵌套一层模型容器,更好控制动画和角色行为,最后把gltf的模型数据导入进来this.modelContainer = new THREE.Group();this.modelContainer.position.y = -0.57;this.tiltContainer.add(this.modelContainer);this.modelContainer.add(gltf.scene);//创建动画混合器this.mixer = new THREE.AnimationMixer(gltf.scene);//速度模拟器,选择模拟器this.velocitySimulator = new VectorSpringSimulator(60, this.defaultVelocitySimulatorMass, this.defaultVelocitySimulatorDamping);this.rotationSimulator = new RelativeSpringSimulator(60, this.defaultRotationSimulatorMass, this.defaultRotationSimulatorDamping);//视图向量(人物看哪里)this.viewVector = new THREE.Vector3();//人物的动作this.actions = {'up': new KeyBinding('KeyW'),'down': new KeyBinding('KeyS'),'left': new KeyBinding('KeyA'),'right': new KeyBinding('KeyD'),'run': new KeyBinding('ShiftLeft'),'jump': new KeyBinding('Space'),'use': new KeyBinding('KeyE'),'enter': new KeyBinding('KeyF'),'enter_passenger': new KeyBinding('KeyG'),'seat_switch': new KeyBinding('KeyX'),'primary': new KeyBinding('Mouse0'),'secondary': new KeyBinding('Mouse1'),};// 使用CapsuleCollider类,创建物理碰撞的角色胶囊this.characterCapsule = new CapsuleCollider({mass: 1,position: new CANNON.Vec3(),height: 0.5,radius: 0.25,segments: 8,friction: 0.0});// capsulePhysics.physical.collisionFilterMask = ~CollisionGroups.Trimesh;//设置能够碰撞的碰撞组(匹配)this.characterCapsule.body.shapes.forEach((shape) => {// tslint:disable-next-line: no-bitwiseshape.collisionFilterMask = ~CollisionGroups.TrimeshColliders;});//允许休眠this.characterCapsule.body.allowSleep = false;// 设置碰撞组this.characterCapsule.body.collisionFilterGroup = 2;// 是否禁止角色碰撞旋转this.characterCapsule.body.fixedRotation = true;//固定旋转this.characterCapsule.body.updateMassProperties();// debugconst boxGeo = new THREE.BoxGeometry(0.1, 0.1, 0.1);const boxMat = new THREE.MeshLambertMaterial({color: 0xff0000});this.raycastBox = new THREE.Mesh(boxGeo, boxMat);this.raycastBox.visible = false;//物理前/后步骤回调绑定this.characterCapsule.body.preStep = (body: CANNON.Body) => { this.physicsPreStep(body, this); };this.characterCapsule.body.postStep = (body: CANNON.Body) => { this.physicsPostStep(body, this); };// 更新角色状态(如待机)this.setState(new Idle(this));}

物体胶囊的形状,在CapsuleCollider类定义了3个球体胶囊叠加

constructor(options: any){let defaults = {mass: 0,position: new CANNON.Vec3(),height: 0.5,radius: 0.3,segments: 8,friction: 0.3};options = Utils.setDefaults(options, defaults);this.options = options;//创建物理材质,名字是自己取的let mat = new CANNON.Material('capsuleMat');mat.friction = options.friction;//创建胶囊的物理bodylet capsuleBody = new CANNON.Body({mass: options.mass,position: options.position});// 创建物理的球形let sphereShape = new CANNON.Sphere(options.radius);capsuleBody.material = mat;// sphereShape.material = mat;//给body设置形状,形状为3个球体叠加capsuleBody.addShape(sphereShape, new CANNON.Vec3(0, 0, 0));capsuleBody.addShape(sphereShape, new CANNON.Vec3(0, options.height / 2, 0));capsuleBody.addShape(sphereShape, new CANNON.Vec3(0, -options.height / 2, 0));this.body = capsuleBody;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/598329.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java流式计算Stream

java流式计算Stream 流(Stream)到底是什么呢? 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。 “集合讲的是数据,流讲的是计算! ” 特点: Stream自己不会存储元素。 Stream不会改变源对象。相反&#x…

职场必修经验:一位测试大神的软件测试工作经验总结

这篇文章,整理下测试工作经验分享 最近,部门刚毕业入职的小伙伴跟大家提议,让大家把自己的软件测试工作经验分享一下,我整理了一下,可能不全。 测试阶段划分 1、 单个模块功能测试时间相对较长,但每一个…

带头双向循环链表实现

1.结构及特性 前面我们实现了无头单向非循环链表,它的结构是这样的: 在这里的head只是一个指向头结点的指针,而不是带头链表的头节点。 而带头双向循环链表的逻辑结构则是这样的 这就是链表的结构,链表的每一个节点都有两个指针…

ROS 2边学边练(15)-- 写一个简单的服务(C++)

前言 此篇我们即将编写一个简单的服务(service)通信例子,客户端节点向服务端节点发出请求(.srv文件中规定了通信的数据结构格式),服务端节点收到请求后将结果回复给客户端节点,一问一答&#xf…

修电机所需要的基本工具

等距式 模具 同心式模具 电机划线刀 压脚 千分尺 -----测量线径 钳形电流表------- 测量 空载 满载下的电流值 摇表, 测量线圈是否碰到外壳 指针式万用表 胶锤 整理线圈 绝缘纸和青稞纸&#xf…

[StartingPoint][Tier1]Funnel

Task 1 How many TCP ports are open? (打开了多少个 TCP 端口?) # nmap -sS -T4 10.129.224.226 --min-rate 1000 2 Task 2 What is the name of the directory that is available on the FTP server? (FTP 服务器上可用的目录名称是什么?) $ n…

什么是商家转账到零钱

商家转账到零钱是什么? 通过商家转账到零钱这个功能,如果我们系统需要对用户支付费用,比如发放佣金、提成、退款之类的,可以直接转账到用户的微信零钱。 【商家转账到零钱】是【企业付款到零钱】的升级版,2022年5月1…

Java 面试宝典:Redis 的线程模型是怎么样的?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站:https://www.skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 Redis 的线程模型其实是分两块的: Redis 6.0 …

10个程序员可以接私活的平台和一些建议

话不多说,直接进入正题。我把我压箱底的10个程序员接私活的平台都拿出来了,看之前记得先点赞收藏~ 码市 互联网网站外包服务平台,这个平台上还有产品原型可供参考。在码市上有一系列规范的接单和发单流程答疑过程,可以很好地帮助…

XML文档节点导航与选择指南 | XPath基础知识

XPath(XML Path Language)是XSLT标准的主要组成部分。它用于在XML文档中浏览元素和属性,提供了一种强大的定位和选择节点的方式。 XPath的基本特点 代表XML路径语言: XPath是一种用于在XML文档中导航和选择节点的语言。 路径样式…

C语言---浮点数在内存中的存储

前面跟大家介绍了整数在内存中的存储,这次再向大家介绍下浮点数在内存中的存储。 我们常见的浮点数有3.14,1E10 等等,浮点数家族包括float,double,long double类型。 浮点数的表示范围在头文件 float.h 定义。 1.浮…

蓝桥杯第十四届C++C组

目录 三国游戏 填充 翻转 【单调队列优化DP】子矩阵 【快速幂、欧拉函数】互质数的个数 【tire树】异或和之差 【质因数分解】公因数匹配 子树的大小 三国游戏 题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都…