Question

Hé les gars, j'ai utilisé mon système L de base et j'ai décidé d'essayer d'optimiser le rendu de l'application. Auparavant, je parcourais toute la chaîne du système L avec un boîtier de commutation et un dessin ... mieux, je vais vous montrer ce que je faisais.

for(unsigned int stringLoop = 0; stringLoop < _buildString.length(); stringLoop++)
{

        switch(_buildString.at(stringLoop))
        {
        case'X':
            //Do Nothing
            //X is there just to facilitate the Curve of the plant
            break;
        case'F':

            _prevState = _currState;
            _currState.position += _currState.direction * stdBranchLength; 
            //Set the previous state to the current state
            _graphics.SetColour3f(0.0f, 1.0f, 0.0f);

            _graphics.Begin(OGLFlags::LINE_STRIP);
                _graphics.Vertex3f(_prevState.position.X(), _prevState.position.Y(), _prevState.position.Z());
                _graphics.Vertex3f(_currState.position.X(), _currState.position.Y(), _currState.position.Z());
            _graphics.End();

            break;
        case'[':
            _prevStack.push(_currState);
            break;
        case']':
            _prevState = _currState;
            _currState = _prevStack.top();
            _prevStack.pop();               
            break;
        case'-':

            _currState.direction = _currState.direction.RotatedAboutZ(-(ROTATION) * Math::DegreesToRadians);

            break;
        case'+':
            _currState.direction = _currState.direction.RotatedAboutZ(ROTATION * Math::DegreesToRadians);

            break;
        };

}

J'ai supprimé tout cela parce que je résolvais littéralement l'arbre chaque image, j'ai changé cette boucle afin qu'elle enregistre tous les vertices dans un vecteur std.

    for(unsigned int stringLoop = 0; stringLoop < _buildString.length(); stringLoop++)
{

        switch(_buildString.at(stringLoop))
        {
        case'X':
            break;
        case'F':

            //_prevState = _currState;
            _currState.position += _currState.direction * stdBranchLength;
            _vertexVector.push_back(_currState.position);

            break;
        case'[':
            _prevStack.push(_currState);
            break;
        case']':
            _currState = _prevStack.top();
            _prevStack.pop();               
            break;
        case'-':            
            _currState.direction = _currState.direction.RotatedAboutZ(-(ROTATION) * Math::DegreesToRadians);
            break;
        case'+':
            _currState.direction = _currState.direction.RotatedAboutZ(ROTATION * Math::DegreesToRadians);
            break;
        };
}

Maintenant, j'ai changé ma boucle de rendu, donc je viens de lire directement à partir du tableau de vecteurs.

    DesignPatterns::Facades::OpenGLFacade _graphics = DesignPatterns::Facades::openGLFacade::Instance();

_graphics.Begin(OGLFlags::LINE_STRIP);
    for(unsigned int i = 0; i < _vertexVector.size(); i++)
    {
        _graphics.Vertex3f(_vertexVector.at(i).X(), _vertexVector.at(i).Y(), _vertexVector.at(i).Z());
    }
_graphics.End();

Maintenant, mon problème est que lorsque j'utilise un tableau vectoriel et que j'utilise Line Stip, je reçois un artefact supplémentaire. La première image correspond au rendu non optimisé, la seconde au rendu le plus récent, plus rapide, et la troisième au rendu d'une courbe de dragon n'utilisant pas de poussée et produisant des effets similaires à ceux utilisés par les deux premières (je suis jolie. que les problèmes entrent en jeu). Est-ce que le problème avec ma logique ici est de stocker les vertices, ou est-ce parce que j'utilise un barreau de lignes? Je voudrais juste utiliser des lignes, mais cela ne fonctionne pas du tout, cela finit par ressembler davantage à un point à la ligne. Je suis également désolé de la longueur de ce message.

texte de remplacement http://img197.imageshack.us/img197/8030/bettera .jpg texte de remplacement http://img23.imageshack.us/img23/3924/buggyrender.jpg texte de remplacement http://img8.imageshack.us/img8/627/dragoncurve.jpg

Était-ce utile?

La solution

Vous obtenez ces lignes supplémentaires parce que vous utilisez LINE_STRIP.

Dans votre cas "F", insérez les deux extrémités de votre ligne dans le vecteur (comme vous le faisiez à l'origine).

_vertexVector.push_back(_prevState.position);
_vertexVector.push_back(_currState.position);

Et lorsque vous dessinez, utilisez plutôt LINE_LIST.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top