MV3D - 3D rendering for RMMV with Babylon.js

CoopNinjask

Veteran
Veteran
Joined
Jan 9, 2020
Messages
105
Reaction score
61
First Language
Portuguese
Primarily Uses
RMMV
@Dread_Nyanak

I was taking a look at the blink and black squares problem and discovered something new.
It seems that the problem only occurs if the event that has the graphics changed is in a range of 2 tiles or less from the player's character.
For some unknown reason, if the event is in a range of 3 or more tiles away, the blink and black square problem does not happen.
I hope this helps to fix the bug.
 

Dread_Nyanak

Veteran
Veteran
Joined
Feb 24, 2019
Messages
165
Reaction score
275
First Language
English
Primarily Uses
RMMV
@safermike
Stair threshold is a global value and can't be set per tile. It allows characters to walk between tiles with slight elevation changes, and allowing it to be set per tile isn't really doable with the current programming.
There are ways you can fake it using events though, like a player touch event that gives the player a move route.
 

LukaYang

Noob
Member
Joined
Feb 9, 2020
Messages
6
Reaction score
0
First Language
Português
Primarily Uses
RMMV
Hello. I really liked your plugin, but there is an error in my game with your plugin. Well, everything is happening normally, but ... the images of the characters are wrong. I don't know if it's my computer, or an error in your plugin.

(I can't place the image, but ... I think you can understand with the text.)
 

Dread_Nyanak

Veteran
Veteran
Joined
Feb 24, 2019
Messages
165
Reaction score
275
First Language
English
Primarily Uses
RMMV
I think I know what you're talking about. Other people have had the same problem. I wish I knew how to reproduce it.

Is it something like this?
View attachment 130205
 
Last edited:

LukaYang

Noob
Member
Joined
Feb 9, 2020
Messages
6
Reaction score
0
First Language
Português
Primarily Uses
RMMV
I think I know what you're talking about. Other people have had the same problem. I wish I knew how to reproduce it.

Is it something like this?
It is this error that is in the photo! I hope there is a way to fix it, because I really want to use your plugin!
 

glaphen

Veteran
Veteran
Joined
Jan 13, 2019
Messages
326
Reaction score
120
First Language
English
Primarily Uses
RMMV
Found a sorta bug with Yanfly Save Core, if you try to load any save from the save screen you cannot move, and map doesn't load only parallax and previous map parts, but if you load from SceneManager.push(Scene_Load); which lets you only load, it works fine. The above is with my game, but in mv3d demo I get visible of undefined when loading that way instead, don't know why it doesn't error in mine.
 

fizzly

Veteran
Veteran
Joined
Mar 23, 2012
Messages
622
Reaction score
386
First Language
Polish
Primarily Uses
RMMV
It is this error that is in the photo! I hope there is a way to fix it, because I really want to use your plugin!
Actually I think it's problem with wrong prepared character file, not the script itself. Or I am wrong?

@Dread_Nyanak thank you for the fixes!
 

WesdrasLink

Veteran
Veteran
Joined
Jan 2, 2013
Messages
40
Reaction score
58
First Language
Portuguese
Primarily Uses
RMMV
In regard on the last update.
My game looks like this:
rmmv3d.png
Before this update, the characters was messy., now it's the map that looks this way, an d the sprites is ok.
 

fizzly

Veteran
Veteran
Joined
Mar 23, 2012
Messages
622
Reaction score
386
First Language
Polish
Primarily Uses
RMMV
@WesdrasLink, Works fine for me, maybe you use some other scripts that collide with babylon?
 

Poppie360

chocobo wrangler
Veteran
Joined
Feb 28, 2018
Messages
175
Reaction score
52
First Language
English
Primarily Uses
RMMV
Hey so, i cant read anything in this plugin so i cant tell what is the issue with the plugin, but it gave me this error;
 

Danielcross

Veteran
Veteran
Joined
Sep 27, 2017
Messages
100
Reaction score
10
First Language
English
Primarily Uses
RMMV
Found a sorta bug with Yanfly Save Core, if you try to load any save from the save screen you cannot move, and map doesn't load only parallax and previous map parts, but if you load from SceneManager.push(Scene_Load); which lets you only load, it works fine. The above is with my game, but in mv3d demo I get visible of undefined when loading that way instead, don't know why it doesn't error in mine.
Dread was nice enough to create a compatibility fix, just yesterday in fact!

try adding mv3d.needClearMap=true; to the end of Scene_File.prototype.onLoadSuccess in the save_core js file.

Also, head's up to people who are using mv3d enable/disable commands. Recent versions of MV3D no longer carry the command to new maps, so you will have to have a map tag like:

<mv3d>

disable()

</mv3d>

If you switch to a new map but want the enable/disable command to continue.
 

CoopNinjask

Veteran
Veteran
Joined
Jan 9, 2020
Messages
105
Reaction score
61
First Language
Portuguese
Primarily Uses
RMMV
@Dread_Nyanak

First, I would like to thank you for fixing the bugs. Worked perfectly!


I am developing an ABS shooter for the MV3D and I have some questions that I need to clarify:

1) I need the Z coordinate of an event (the bullet of a revolver) to always be equal to the value of the Z coordinate of the player. Is there a way for the Z coordinate of an event to take the value of a variable from note tags?
I tried here, but the event was invisible. It seems that it failed to get the value of the variable.

Bullet - Variable.png


2) How do I make a condition based on the Z coordinate of an event?
For example: Check if the Z coordinate value of the bullet is equal to the Z coordinate value of an enemy on the map and, if true, activates a result that would correspond to what would happen when a collision occurred.

3) Is there a way for the event to collide only if it has the same Z coordinate as an object on the map? (I say object as a tileset B, C, D and etc., not an event)
Ideally, the bullet would hit the object if it had the same Z, but go over the object if it had a higher Z than the object.

4) Finally, I wanted to know if there is a way for the event (bullet) to go over the river tileset, even with the passability of the river tileset blocking the player (X passability) and the other events.
Thus it would be possible to activate switches that were on the other side of a river by a shot, making a bridge appear for the player to cross the river, for example.
 

MikePjr

Artist
Veteran
Joined
Nov 7, 2012
Messages
713
Reaction score
438
First Language
English
Primarily Uses
I wouldn't mind seeing some sort of ability to use simplistic 3D models for things like maybe doors, or types of roofs for homes.
If anyone is familure with early 3D games, you'll know what i mean.
Like Shining the Holy Ark.
 

glaphen

Veteran
Veteran
Joined
Jan 13, 2019
Messages
326
Reaction score
120
First Language
English
Primarily Uses
RMMV
@Dread_Nyanak

First, I would like to thank you for fixing the bugs. Worked perfectly!


I am developing an ABS shooter for the MV3D and I have some questions that I need to clarify:

1) I need the Z coordinate of an event (the bullet of a revolver) to always be equal to the value of the Z coordinate of the player. Is there a way for the Z coordinate of an event to take the value of a variable from note tags?
I tried here, but the event was invisible. It seems that it failed to get the value of the variable.

View attachment 133812


2) How do I make a condition based on the Z coordinate of an event?
For example: Check if the Z coordinate value of the bullet is equal to the Z coordinate value of an enemy on the map and, if true, activates a result that would correspond to what would happen when a collision occurred.

3) Is there a way for the event to collide only if it has the same Z coordinate as an object on the map? (I say object as a tileset B, C, D and etc., not an event)
Ideally, the bullet would hit the object if it had the same Z, but go over the object if it had a higher Z than the object.

4) Finally, I wanted to know if there is a way for the event (bullet) to go over the river tileset, even with the passability of the river tileset blocking the player (X passability) and the other events.
Thus it would be possible to activate switches that were on the other side of a river by a shot, making a bridge appear for the player to cross the river, for example.
You can check my bird script on page 31, should be able to show you how to do it, just make a movement route script pretty much same as I did for birds. Number 2 should be answered by my bird chase script as well. 3 you could probably do by tagging regions as a comparison in the movement like the bird script. 4 you could probably turn on through temporarily, which I did in my heavily edited bird chase script recently, perhaps it will be of use.



Code:
Game_Event.prototype.clearChaseSettings = function() {
  this._alertCommonEvent = Yanfly.Param.ECPAlertEvent;
  this._alertLock = 0;
  this._alertPlayer = false;
  this._alertSound = Yanfly.Param.ECPAlertSound;
  this._alertSoundVol = 100;
  this._alertSoundPitch = 100;
  this._alertSoundPan = 0;
  this._chasePlayer = false;
  this._chaseRange = 0;
  this._chaseSpeed = this._moveSpeed;
  this._defaultSpeed = this._moveSpeed;
  this._fleePlayer = false;
  this._fleeRange = 0;
  this._fleeSpeed = this._moveSpeed;
  this._seePlayer = Yanfly.Param.ECPSeePlayer;
  this._sightLock = Yanfly.Param.ECPSightLock;
  this._returnAfter = Yanfly.Param.ECPReturn;
  this._returnWait = Yanfly.Param.ECPReturnWait;
  this._returnPhase = false;
  this._returnFrames = 0;
  this._staggerCount = 0;
  this._startLocationX = this.x;
  this._startLocationY = this.y;
  this._startLocationDir = this._direction;
  this._bird = false;
  this._startchase = false;
  this._fleelvl = 200;
  this._defaultThrough = this._through;
  this._defaultFreq = this._moveFrequency;
  this._chaseFreq = this._moveFrequency;
  this._encount = 0;
  this._fight = false;
};

Yanfly.ECP.Game_Event_setupPage = Game_Event.prototype.setupPage;
Game_Event.prototype.setupPage = function() {
    Yanfly.ECP.Game_Event_setupPage.call(this);
    this.clearChaseSettings();
};

Game_Event.prototype.activateAlert = function() {
    if (this._fleePlayer) {
    this.requestBalloon(6);
    } else if (this._returnPhase && !this._startchase) {
    this.requestBalloon(6);
    } else if (this._returnPhase) {
    this.requestBalloon(5);
    } else {
    this.requestBalloon(1);
    }
    this._alertPlayer = true;
    this.playAlertSound();
    this.playAlertCommonEvent();
};

Game_Event.prototype.updateChaseDistance = function() {
    if (this._erased) return;
    if (this._chaseRange <= 0) return;
    if (this._fleePlayer) return;
    var dis = Math.abs(this.deltaXFrom($gamePlayer.x));
    dis += Math.abs(this.deltaYFrom($gamePlayer.y));
    if (this.chaseConditions(dis)) {
    if (dis <= 1) {
    if (this.z <= $gamePlayer.z) {
        if (this._opacity > 200) this.start();
    }
    }
      this.startEventChase();
    } else if (this._chasePlayer) {
      this.startReturnPhase();
    }
};

Game_Event.prototype.canSeePlayer = function() {
    if (!this._seePlayer) return false;
    var sx = this.deltaXFrom($gamePlayer.x);
    var sy = this.deltaYFrom($gamePlayer.y);
    if (Math.abs(sx) > Math.abs(sy)) {
      var direction = (sx > 0) ? 4 : 6;
    } else {
      var direction = (sy > 0) ? 8 : 2;
    }
    if (direction === this.direction()) {                              
      return true;
    }
    return false;
};

Game_Event.prototype.chaseConditions = function(dis) {
    if (dis <= this._chaseRange && this.nonSeePlayer()) return true;                                    
    if (dis <= this._chaseRange && this.canSeePlayer()) return true;
    return false;
};

Game_Event.prototype.fleeConditions = function(dis) {
    if (dis <= this._fleeRange && this.canSeePlayer()) return true;
    if (dis <= this._fleeRange && !this._seePlayer) return true;
    return false;
};

Game_Event.prototype.startEventChase = function() {
    if (!this._returnPhase) {
    this._through = true
    this._chasePlayer = true;
    this.activateAlert();
    this._alertLock = this._sightLock;
    this.setMoveSpeed(this._chaseSpeed);
    this.setMoveFrequency(this._chaseFreq);
    this._startchase = true;
    }
};

Game_Event.prototype.startEventFlee = function() {
    if (!this._returnPhase) {
    this._fleePlayer = true;
    this.activateAlert();
    this._alertLock = this._sightLock;
    this.setMoveSpeed(this._fleeSpeed);
    this.setMoveFrequency(this._chaseFreq);
    this._startchase = true;
    }
};

Game_Event.prototype.updateFleeDistance = function() {
    if (this._erased) return;
    if (this._fleelvl > $gameVariables.value(33)) return;
    var dis = Math.abs(this.deltaXFrom($gamePlayer.x));
    dis += Math.abs(this.deltaYFrom($gamePlayer.y));
    if (this.fleeConditions(dis)) {
    if (dis <= 1) {
    if (this.z <= $gamePlayer.z) {
        if (this._opacity > 200) this.start();
    }
    }
      this.startEventFlee();
    } else if (this._fleePlayer) {
      this.startReturnPhase();
    }
};

Game_Event.prototype.checkFacing = function() {
    var x = this._x;
    var y = this._y;
    var d = this._direction;
    var pl = $gamePlayer;
    var px = pl._x;
    var py = pl._y
    var pd = pl._direction;
    if (x > px && y === py) {
        if (pd === 6) {
                if (d === 6) {
                    this._encount = 1;
                    return true;
                } else {
                    return true;
                    };
        } else if (d === 4) {
            if (pd === 4) {
                this._encount = 2;
            return true;
            } else {
                return true;
                };
        } else {
            return false;
        };
    } else if (x < px && y === py) {
        if (pd === 4) {
                if (d === 4) {
                    this._encount = 1;
                    return true;
                } else {
                    return true;
                    };
        } else if (d === 6) {
            if (pd === 6) {
                this._encount = 2;
            return true;
            } else {
                return true;
                };
        } else {
            return false;
        };
    } else if (y > py && x === px) {
        if (pd === 2) {
                if (d === 2) {
                    this._encount = 1;
                    return true;
                } else {
                    return true;
                    };
        } else if (d === 8) {
            if (pd === 8) {
                this._encount = 2;
            return true;
            } else {
                return true;
                };
        } else {
            return false;
        };
    } else if (y < py && x === px) {
        if (pd === 8) {
                if (d === 8) {
                    this._encount = 1;
                    return true;
                } else {
                    return true;
                    };
        } else if (d === 2) {
            if (pd === 2) {
                this._encount = 2;
            return true;
            } else {
                return true;
                };
        } else {
            return false;
        };
    } else if (y === py && x === px) {
        return true;
    } else {
        return false;
    }
};

Game_Event.prototype.updateChaseMovement = function() {
    if (this._erased) return;
    var trig = this._trigger;
    if (trig > 2) return;
    var dis = Math.abs(this.deltaXFrom($gamePlayer.x));
    dis += Math.abs(this.deltaYFrom($gamePlayer.y));
    if (trig > 0) {
    if (dis <= 1) {
        if (this.z <= $gamePlayer.z) {
            if (this._opacity > 200) {
                if (this.checkFacing()) {
                    this._fight = true;
                    return this.start();
    }}}}}
    if (!this._startchase) {
        if (this._fleelvl < $gameVariables.value(33)) {
                if (this.fleeConditions(dis)) this.startEventFlee();
        } else if (this.chaseConditions(dis)) this.startEventChase();
    } else if (this._alertLock <= 0) this.startReturnPhase();
    var x = this._x;
    var y = this._y;
    var r = this._returnPhase;
    if ($gameSwitches.value(159)) {
    var Edge = $gameMap._myVariable;
    if (y > Edge[0] || y < Edge[1] || x > Edge[2] || x < Edge[3]) {
        if (!r) this.startReturnPhase();
    }
    }
    if (!r && !this._startchase || $gameSwitches.value(160)) return Yanfly.ECP.Game_Event_updateSelfMovement.call(this);
    if (this._staggerCount > 0) {
      return this._staggerCount--;
    }
    if (this._stopCount > 0 && this._chasePlayer) {
      var direction = this.findDirectionTo($gamePlayer.x, $gamePlayer.y);
      if (direction > 0) {
        this.moveStraight(direction);
        if (this._bird) {
            var fly = new Game_Interpreter()
            fly.pluginCommand('mv3d', ['@e' + this.eventId(), 'elevation', '0', '3.5']);
                }
        if (x === this._x && y === this._y) this._staggerCount = 20;
      }
    } else if (this._stopCount > 0 && this._fleePlayer) {
      this.updateFleeMovement();
    } else if (r) {
      this.updateMoveReturnAfter();
    }
};

Game_Character.prototype.Randommove = function() {
    switch (Math.randomInt(5)) {
    case 0: case 1:
        this.moveRandom();
        break;
    case 2: case 3: case 4:
        this.moveForward();
        break;
    }
};


Game_Character.prototype.flyRandom = function() {
    switch (Math.randomInt(8)) {
    case 0: case 1:
    if (this.z <= $gamePlayer.z) {
        this.ascend();
        break;
    }
        this.descend();
        break;
     case 2: case 3: case 4: case 5: case 6: case 7:
    if (this.z >= $gamePlayer.z + 5) {
        this.descend();
        break;
    }
        this.ascend();
        break;
    }
};

Game_Character.prototype.ascend = function() {
        var fly = new Game_Interpreter()
        var RNG = Math.floor(Math.random(15) * 10) / 3
        fly.pluginCommand('mv3d', ['@e' + this.eventId(), 'elevation', '+' + RNG, '0.853']);
};

Game_Character.prototype.descend = function() {
        var fly = new Game_Interpreter()
        var RNG = this.z - Math.floor(Math.random(30) * 10) / 3;
        fly.pluginCommand('mv3d', ['@e' + this.eventId(), 'elevation', '' + RNG, '0.853']);
};

Game_Event.prototype.startReturnPhase = function() {
    this._chasePlayer = false;
    this._fleePlayer = false;
    this.setMoveSpeed(this._defaultSpeed);
    this.setMoveFrequency(this._defaultFreq);
    this._returnPhase = true;
    this.activateAlert();
    this._alertLock = 0;
    this._alertPlayer = false;
    this._returnFrames = this._returnWait;
};

Game_Event.prototype.updateMoveReturnAfter = function() {
    if (this._returnFrames > 0) return;
        if (!this._returnAfter) {
        this._returnPhase = false;
        this._returnFrames = 0;
        this._startchase = false;
        }
    var sx = this.deltaXFrom(this._startLocationX);
    var sy = this.deltaYFrom(this._startLocationY);
    if (this._bird) this.flyRandom();
    if (Math.abs(sx) > Math.abs(sy)) {
      if (Math.randomInt(6) <= 4) {
        this.moveStraight(sx > 0 ? 4 : 6);
        if (!this.isMovementSucceeded() && sy !== 0) {
          this.moveStraight(sy > 0 ? 8 : 2);
        }
      } else {
        this.moveRandom();
      }
    } else if (sy !== 0) {
      if (Math.randomInt(6) <= 4) {
        this.moveStraight(sy > 0 ? 8 : 2);
        if (!this.isMovementSucceeded() && sx !== 0) {
          this.moveStraight(sx > 0 ? 4 : 6);
        }
      } else {
        this.moveRandom();
      }
    }
    if (sx === 0 && sy === 0) {
      this._returnPhase = false;
      this._returnFrames = 0;
      this._direction = this._startLocationDir;
      this.setThrough(this._defaultThrough);
      this._startchase = false;
    }
};

Also included my heavily removed chase script as I edited it so much I think I'll just combine them soon.
Code:
Yanfly.ECP.Game_Event_updateSelfMovement =
    Game_Event.prototype.updateSelfMovement;
Game_Event.prototype.updateSelfMovement = function() {
    if (Imported.YEP_StopAllMove && $gameSystem.isEventMoveStopped()) return;
    this.updateChaseMovement();
};

Yanfly.ECP.Game_Event_update = Game_Event.prototype.update;
Game_Event.prototype.update = function() {
    Yanfly.ECP.Game_Event_update.call(this);
    this.updateReturnPhase();
};

Game_Event.prototype.canSeePlayer = function() {
    if (!this._seePlayer) return false;
    var sx = this.deltaXFrom($gamePlayer.x);
    var sy = this.deltaYFrom($gamePlayer.y);
    if (Math.abs(sx) > Math.abs(sy)) {
      var direction = (sx > 0) ? 4 : 6;
    } else {
      var direction = (sy > 0) ? 8 : 2;
    }
    if (direction === this.direction()) {
      this._alertLock = this._sightLock;
      return true;
    }
    return false;
};


Game_Event.prototype.nonSeePlayer = function() {
  if (Imported.YEP_X_EventChaseStealth) {
    if (this.meetStealthModeConditions()) {
      this.stealthClearChaseSettings();
      this._stopCount = 0;
      return false;
    }
  }
  return !this._seePlayer;
};

Game_Event.prototype.updateFleeDistance = function() {
    if (this._erased) return;
    if (this._fleeRange <= 0) return;
    var dis = Math.abs(this.deltaXFrom($gamePlayer.x));
    dis += Math.abs(this.deltaYFrom($gamePlayer.y));
    if (this.fleeConditions(dis)) {
      this.startEventFlee();
    } else if (this._fleePlayer) {
      this.endEventFlee();
    }
};

Game_Event.prototype.fleeConditions = function(dis) {
    if (this._alertLock > 0) return true;
    if (dis <= this._fleeRange && this.canSeePlayer()) return true;
    if (dis <= this._fleeRange && !this._seePlayer) {
      this._alertLock = this._sightLock;
      return true;
    }
    return false;
};

Game_Event.prototype.startEventFlee = function() {
    this._fleePlayer = true;
    this.setMoveSpeed(this._fleeSpeed);
};

Game_Event.prototype.endEventFlee = function() {
    this._fleePlayer = false;
    this.setMoveSpeed(this._defaultSpeed);
    if (this._alertTimer <= 0) this._alertPlayer = false;
    this.startReturnPhase();
};

Game_Event.prototype.updateChaseMovement = function() {
    if (this._staggerCount > 0) {
      return this._staggerCount--;
    }
    if (this._stopCount > 0 && this._chasePlayer) {
      var direction = this.findDirectionTo($gamePlayer.x, $gamePlayer.y);
      if (direction > 0) {
        var x = this._x;
        var y = this._y;
        this.moveStraight(direction);
        if (x === this._x && y === this._y) this._staggerCount = 20;
      }
    } else if (this._stopCount > 0 && this._fleePlayer) {
      this.updateFleeMovement();
    } else if (this._returnPhase) {
      this.updateMoveReturnAfter();
    } else {
      Yanfly.ECP.Game_Event_updateSelfMovement.call(this);
    }
};

Game_Event.prototype.updateFleeMovement = function() {
    switch (Math.randomInt(6)) {
    case 0: case 1: case 2: case 3: case 4:
      this.moveAwayFromPlayer();
      break;
    case 5:
      this.moveRandom();
      break;
    }
};

Game_Event.prototype.playAlertSound = function() {
    if (this._alertSound === '') return;
    var sound = {
      name:   this._alertSound,
      volume: this._alertSoundVol,
      pitch:  this._alertSoundPitch,
      pan:    this._alertSoundPan
    };
    AudioManager.playSe(sound);
};

Game_Event.prototype.playAlertCommonEvent = function() {
    if (this._alertCommonEvent <= 0) return;
    $gameTemp.reserveCommonEvent(this._alertCommonEvent);
};

Game_Event.prototype.startReturnPhase = function() {
    if (!this._returnAfter) return;
    this._returnPhase = true;
    this._returnFrames = this._returnWait;
};

Game_Event.prototype.updateReturnPhase = function() {
    if (this._returnPhase) this._returnFrames--;
    if (this._alertLock) this._alertLock--;
};

Game_Event.prototype.updateMoveReturnAfter = function() {
    if (this._returnFrames > 0) return;
    var sx = this.deltaXFrom(this._startLocationX);
    var sy = this.deltaYFrom(this._startLocationY);
    if (Math.abs(sx) > Math.abs(sy)) {
      if (Math.randomInt(6) <= 4) {
        this.moveStraight(sx > 0 ? 4 : 6);
        if (!this.isMovementSucceeded() && sy !== 0) {
          this.moveStraight(sy > 0 ? 8 : 2);
        }
      } else {
        this.moveRandom();
      }
    } else if (sy !== 0) {
      if (Math.randomInt(6) <= 4) {
        this.moveStraight(sy > 0 ? 8 : 2);
        if (!this.isMovementSucceeded() && sx !== 0) {
          this.moveStraight(sx > 0 ? 4 : 6);
        }
      } else {
        this.moveRandom();
      }
    }
    if (sx === 0 && sy === 0) {
      this._returnPhase = false;
      this._returnFrames = 0;
      this._direction = this._startLocationDir;
    }
};

Here's event page in case it helps with conditionals.
Slime1.pngSlime2.png
I had to turn on through since anything that tracks calculates destinations based off player seems to be extremely laggy unless set to through, even moving using the mouse diagonally at long distances.
 

fizzly

Veteran
Veteran
Joined
Mar 23, 2012
Messages
622
Reaction score
386
First Language
Polish
Primarily Uses
RMMV
I wouldn't mind seeing some sort of ability to use simplistic 3D models for things like maybe doors, or types of roofs for homes.
If anyone is familure with early 3D games, you'll know what i mean.
Like Shining the Holy Ark.
To create different roofs you can use already implemented slopes. Doors also can be made with "fence" or "wall".
 

MikePjr

Artist
Veteran
Joined
Nov 7, 2012
Messages
713
Reaction score
438
First Language
English
Primarily Uses
Eh.. not what i meant.. but okay...
Also.. slopes? Didn't notice anything about slopes..
 

fizzly

Veteran
Veteran
Joined
Mar 23, 2012
Messages
622
Reaction score
386
First Language
Polish
Primarily Uses
RMMV
Eh.. not what i meant.. but okay...
Also.. slopes? Didn't notice anything about slopes..
Check description of rm3d-babylon.js. Slopes like in the stairs. Place stair tiles to see slopes. You can texture it with roof and change direction to make roofs. There are no placed slopes in the actual demo, I think.
 

tseyik

Villager
Member
Joined
Oct 22, 2015
Messages
20
Reaction score
19
First Language
English
Primarily Uses
Check description of rm3d-babylon.js. Slopes like in the stairs. Place stair tiles to see slopes. You can texture it with roof and change direction to make roofs. There are no placed slopes in the actual demo, I think.
MAP slope test
001.jpg

mv3d-babylon.js presets
001.jpg
 

Attachments

Last edited:

Users Who Are Viewing This Thread (Users: 0, Guests: 7)

Latest Threads

Latest Posts

Latest Profile Posts

Newest RPG Maker drops: hey fellas, get on the MZ train to somewhere

Me: Building my VX Ace lego tower, blissfully unaware of time moving forward
When you are trying to make progress in your game. But something is stopping your motivation. Like come on mind! Let me do what I want! :<
Tfw everyone is trying their hardest to brainstorm about unique ideas and game mechanics, here I am just going: "How am I gonna event conversations with busts" everyday. :kaoswt2:
Comedy is third person, tragedy is first person.
Man. A historic 130 year old church nearby had all of its windows broken out with bricks last night. Such a shame, it wasn't generic stained glass patterns either but had beautifully crafted murals depicting various parts of the gospels.

Forum statistics

Threads
99,320
Messages
964,133
Members
130,928
Latest member
LadyElselin
Top