Добавление графа сцены рисованного объекта в main.js - PullRequest
0 голосов
/ 07 декабря 2018

Я создаю сцену, используя холст HTML, у меня есть объект, который я хочу нарисовать на холсте.Я использую граф сцены, чтобы применить преобразования к моему пользовательскому объекту рисования.

Я создал граф сцены в моем собственном объекте, чтобы применить мои локальные преобразования. Это выглядит следующим образом

class House 
{
constructor(pPosition, pScale, pRotation)
{
    this.setPosition(pPosition);
    this.setRotation(pRotation);
    this.setScale(pScale);
    this.initialiseSceneGraph();
}
getPosition()
{
    return this.mPosition;
}
setPosition(pPosition)
{
    this.mPosition = pPosition;
}
getRotation()
{
    return this.mRotation;
}
setRotation(pRotation)
{
    this.mRotation = pRotation;
}
getScale()
{
    return this.mScale;
}
setScale(pScale)
{
    this.mScale = pScale;
}
getSceneGraph()
{
    return this.mHouseSceneGraph;
}
setSceneGraph(pHouseSceneGraph)
{
    this.mHouseSceneGraph = pHouseSceneGraph;
}
initialiseSceneGraph()
{
    var transMatrix, transVector, rotationMatrix, scaleMatrix, scaleVector;
    // transVector = new Vector (0,0,0);
    transMatrix = Matrix.createTranslation(this.mPosition);
    this.mTransNode = new sceneGraph(transMatrix);
    rotationMatrix = Matrix.createRotation(this.mRotation);
    this.mRotationNode = new sceneGraph(rotationMatrix);
    //scaleVector = new Vector (1, 1, 0);
    scaleMatrix = Matrix.createScale(this.mScale);
    this.mScaleNode = new sceneGraph(scaleMatrix);

    var identity = new Matrix(Matrix.createIdentity());
    this.mHouseSceneGraph = new sceneGraph(identity);


    this.mHouseSceneGraph.addChild(this.mTransNode);
    this.mTransNode.addChild(this.mRotationNode);
    this.mRotationNode.addChild(this.mScaleNode);


}
drawWall(pContext, pMatrix)
{  
    //main house body
    pContext.beginPath();
    pContext.fillStyle = '#ffffff';
    pContext.strokeStyle ='#000000';
    pContext.moveTo(0, 0); // position - middle bottom
    pContext.lineTo (-100, 0); // position - bottom left
    pContext.lineTo (-100, -100); // position - top left
    pContext.lineTo (+100, -100); // position - top right
    pContext.lineTo (+100, 0); // position - bottom right
    pContext.closePath(); // used to close the shape
    pContext.fill();
    pContext.stroke();

}
moveWall(pContext, pMatrix)
{
    var transMatrix = Matrix.createTranslation(new Vector(0, 0, 0));
    this.mWallTransNode = new sceneGraph(transMatrix);
    this.mScaleNode.addChild(this.mWallTransNode);
    this.mWallTransNode.addChild(this.drawWall);
}
drawRoof(pContext, pMatrix)
{
    //house roof
    pContext.beginPath();                
    pContext.fillStyle = '#ff0000';
    pContext.strokeStyle ='#000000';
    pContext.moveTo (-100, 0); //position - top left
    pContext.lineTo (0, -100); //position - top 
    pContext.lineTo (+100, 0); //position - top right
    pContext.closePath();
    pContext.fill();
    pContext.stroke();
    //pMatrix.setTransform(pContext);
}
moveRoof()
{
    var transMatrix = Matrix.createTranslation(new Vector(0, -100, 0));
    this.mRoofTransNode = new sceneGraph(transMatrix);
    this.mScaleNode.addChild(this.mRoofTransNode);
    this.mRoofTransNode.addChild(this.drawRoof);
}
drawDoor(pContext, pMatrix)
{ 
    //house door
    pContext.beginPath();
    pContext.fillStyle = '#00ff00';
    pContext.strokeStyle ='#000000';
    pContext.moveTo (-25, 0);
    pContext.lineTo (-25, -75);
    pContext.lineTo (+25, -75);
    pContext.lineTo (+25, 0);
    pContext.closePath();
    pContext.fill();
    pContext.stroke();
}
moveDoor()
{
    var transMatrix = Matrix.createTranslation(new Vector(0, 0, 0));
    this.mDoorTransNode = new sceneGraph(transMatrix);
    this.mScaleNode.addChild(this.mDoorTransNode);
    this.mDoorTransNode.addChild(this.drawRoof);
}
drawWindow(pContext, pMatrix)
{
    pContext.beginPath();
    pContext.fillStyle = '#0000ff';
    pContext.strokeStyle ='#000000';
    pContext.moveTo (-15, -20); 
    pContext.lineTo (-15, + 20); 
    pContext.lineTo (+15, +20);
    pContext.lineTo (+15, -20);
    pContext.closePath();
    pContext.fill();
    pContext.stroke();
}
moveLeftWindow()
{
    var transMatrix = Matrix.createTranslation(new Vector(-60, -50, 0));
    this.mLeftWindowTransNode = new sceneGraph(transMatrix);
    this.mScaleNode.addChild(this.mLeftWindowTransNode);
    this.mLeftWindowTransNode.addChild(this.drawWindow);
}
moveRightWindow()
{
    var transMatrix = Matrix.createTranslation(new Vector(-60, -50, 0));
    this.mRightWindowTransNode = new sceneGraph(transMatrix);
    this.mScaleNode.addChild(this.mRightWindowTransNode);
    this.mRightWindowTransNode.addChild(this.drawWindow);
}
}

у меня возникает проблема, когда я хочу добавить граф сцены дома в мой граф сцены мира в моем файле main.js, я получаю сообщение об ошибке TypeError: House.getSceneGraph is not a function.Мой код main.js выглядит следующим образом:

function onload()
{
var mainCanvas, mainContext, housePosition, houses, sunPostion, suns;
// this function will initialise our variables
function initialiseCanvasContext()
{
    mainCanvas = document.getElementById('mainCanvas');
    if (!mainCanvas){
        alert ('Error: cannot find canvas element');
        return;
    }
    mainContext = mainCanvas.getContext('2d');
    if (!mainContext){
        alert('error: failed to get context');
        return;
    }

    var transVector = new Vector (mainCanvas.width / 2, mainCanvas.height / 2, 0);
    var transMatrix = Matrix.createTranslation(transVector);
    var mSceneGraphRoot = new sceneGraph(transMatrix);

    var houseSceneGraph = new sceneGraph;
    houseSceneGraph = House.getSceneGraph();
    mSceneGraphRoot.addChild(houseSceneGraph);
}
function draw()
{
    var i, j;
    mainContext.fillStyle = "#ffffff";
    mainContext.fillRect(0, 0, mainCanvas.width, mainCanvas.height);
    // mainContext.font = "40pt Century Gothic";
    // mainContext.fillStyle = "#ffffff"
    // mainContext.fillText("hello world!", 150,100);
    mainContext.lineWidth = 5;
    mainContext.lineJoin = 'round';

    mSceneGraphRoot.draw(mainContext, Matrix.createIdentity());
}
initialiseCanvasContext();
draw();
}
window.addEventListener('load', onload, false);

Я чувствую, что getSceneGraph() правильный, поэтому я не уверен, почему он не работает.любая помощь, объясняющая, почему это не работает, будет оценена

...