Harlotte 发表于 2024-5-5 12:51:08

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

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



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

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


今天随便写了一个可动轮的代码和大家分享一下。
主要思路是一个在原点的轮子移动、旋转并带有一些简单的逻辑。
https://image.hokubu.cn/i/2024/05/05/66370fafd225b.png

wheel文件中名为wheel的模型(上图)
https://image.hokubu.cn/i/2024/05/05/66370ff91c31b.png

简单的应用(上图)

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

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

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

function render(ctx, state, train) {
if(train.speed()-state.speed>0){
    if(train.isReversed()){
      state.r = state.r - train.speed() / ( pid * Math.PI ) * 360 * Timing.delta() * 20;
    }else{
      state.r = state.r + train.speed() / ( pid * Math.PI ) * 360 * Timing.delta() * 20;
    }
}else if(train.speed()-state.speed==0){
    state.r = state.r;
}
for (let i = 0; i < train.trainCars(); i++) {
    let mat = new Matrices();
    mat.translate(0,d,0);
    mat.translate(0,0,s1);
    mat.pushPose();
    mat.rotateX(state.r);
    ctx.drawCarModel(models["wheel"], i, mat);
    mat.popPose();
    mat.translate(0,0,s2);
    mat.pushPose();
    mat.rotateX(state.r);
    ctx.drawCarModel(models["wheel"], i, mat);
    mat.popPose();
    mat.translate(0,0,s2);
    mat.pushPose();
    mat.rotateX(state.r);
    ctx.drawCarModel(models["wheel"], i, mat);

    let mat2 = new Matrices();
    mat2.translate(0,d,0);
    mat2.translate(0,0,-s1);
    mat2.pushPose();
    mat2.rotateX(state.r);
    ctx.drawCarModel(models["wheel"], i, mat2);
    mat2.popPose();
    mat2.translate(0,0,-s2);
    mat2.pushPose();
    mat2.rotateX(state.r);
    ctx.drawCarModel(models["wheel"], i, mat2);
    mat2.popPose();
    mat2.translate(0,0,-s2);
    mat2.pushPose();
    mat2.rotateX(state.r);
    ctx.drawCarModel(models["wheel"], i, mat2);
}
state.speed=train.speed();
}




function uploadPartedModels(rawModels) {
    let result = {};
    for (it = rawModels.entrySet().iterator(); it.hasNext(); ) {
      entry = it.next();
      entry.getValue().applyUVMirror(false, true);
      result = ModelManager.uploadVertArrays(entry.getValue());
    }
    return result;
}



yomi 发表于 2024-5-5 15:42:15

这个代码该放到哪里:L

Harlotte 发表于 2024-5-5 15:54:11

yomi 发表于 2024-5-5 15:42
这个代码该放到哪里

我想你理解了以后就会知道的 推荐阅读https://www.zbx1425.cn/nautilus/mtr-nte/#/js-train
页: [1]
查看完整版本: 关于可动车轮的简单教程和JS代码分享