开启左侧

关于可动车轮的简单教程和JS代码分享

[复制链接]
Harlotte 作者认证 2024-5-5 12:51:08

还没有账号?赶快去注册吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 Harlotte 于 2024-5-6 21:20 编辑



关于随机摇晃、车轮转动、判断轨道类型、使用js完成音效播放的JS代码分享
https://www.mtrbbs.top/thread-6680-1-1.html
(出处: MTRBBS 我的世界铁路中文论坛)

上面是本贴的更新版本,请尽量参考上贴。


今天随便写了一个可动轮的代码和大家分享一下。
主要思路是一个在原点的轮子移动、旋转并带有一些简单的逻辑。


wheel文件中名为wheel的模型(上图)


简单的应用(上图)

列车是我这几天从rtm搬到mtr的df5g 原作者金色原野,已取得移植许可,过两天做完了会免费分享出来
这是我第一次写js,效率什么的可能不是最优,恳请多多批评指正。代码如下,欢迎各位尝试。

  1. var rms = ModelManager.loadPartedRawModel(Resources.manager(), Resources.idRelative("wheel.obj"), null);
  2. var models = uploadPartedModels(rms);
  3. var pid=1.2 //轮子直径
  4. var d=-0.446434; //轮子距原点纵轴距离
  5. var s1=3.1358; //轮子距原点横距离1
  6. var s2=1.80722; //轮子距原点横距离2

  7. function create(ctx, state, train) {
  8.   state.r = 0;
  9.   state.speed = 0;
  10. }

  11. function render(ctx, state, train) {
  12.   if(train.speed()-state.speed>0){
  13.     if(train.isReversed()){
  14.       state.r = state.r - train.speed() / ( pid * Math.PI ) * 360 * Timing.delta() * 20;
  15.     }else{
  16.       state.r = state.r + train.speed() / ( pid * Math.PI ) * 360 * Timing.delta() * 20;
  17.     }
  18.   }else if(train.speed()-state.speed==0){
  19.     state.r = state.r;
  20.   }
  21.   for (let i = 0; i < train.trainCars(); i++) {
  22.     let mat = new Matrices();
  23.     mat.translate(0,d,0);
  24.     mat.translate(0,0,s1);
  25.     mat.pushPose();
  26.     mat.rotateX(state.r);
  27.     ctx.drawCarModel(models["wheel"], i, mat);
  28.     mat.popPose();
  29.     mat.translate(0,0,s2);
  30.     mat.pushPose();
  31.     mat.rotateX(state.r);
  32.     ctx.drawCarModel(models["wheel"], i, mat);
  33.     mat.popPose();
  34.     mat.translate(0,0,s2);
  35.     mat.pushPose();
  36.     mat.rotateX(state.r);
  37.     ctx.drawCarModel(models["wheel"], i, mat);

  38.     let mat2 = new Matrices();
  39.     mat2.translate(0,d,0);
  40.     mat2.translate(0,0,-s1);
  41.     mat2.pushPose();
  42.     mat2.rotateX(state.r);
  43.     ctx.drawCarModel(models["wheel"], i, mat2);
  44.     mat2.popPose();
  45.     mat2.translate(0,0,-s2);
  46.     mat2.pushPose();
  47.     mat2.rotateX(state.r);
  48.     ctx.drawCarModel(models["wheel"], i, mat2);
  49.     mat2.popPose();
  50.     mat2.translate(0,0,-s2);
  51.     mat2.pushPose();
  52.     mat2.rotateX(state.r);
  53.     ctx.drawCarModel(models["wheel"], i, mat2);
  54.   }
  55.   state.speed=train.speed();
  56. }




  57. function uploadPartedModels(rawModels) {
  58.     let result = {};
  59.     for (it = rawModels.entrySet().iterator(); it.hasNext(); ) {
  60.       entry = it.next();
  61.       entry.getValue().applyUVMirror(false, true);
  62.       result[entry.getKey()] = ModelManager.uploadVertArrays(entry.getValue());
  63.     }
  64.     return result;
  65.   }
复制代码




yomi 2024-5-5 15:42:15
这个代码该放到哪里
楼主 Harlotte 作者认证 2024-5-5 15:54:11
yomi 发表于 2024-5-5 15:42
这个代码该放到哪里

我想你理解了以后就会知道的 推荐阅读https://www.zbx1425.cn/nautilus/mtr-nte/#/js-train
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表