luismrsilva / cg-micromachines

3D version of the first MicroMachines game, made for the Computer Graphics course (2015/2016) at IST, CS BSc
1 stars 0 forks source link

Camara móvel mostra nada #18

Closed luismrsilva closed 9 years ago

luismrsilva commented 9 years ago

Deve-se ao facto de a posição da camara ser pos_carro-speed_carro; Quando speed é nulo, a camara fica na mesma posição que o carro e não se vê nada.

Sugestão de solução: distância mínima entre a camara e o carro; Posição da camara passa a ser (d_min + pos_carro - speed_carro); Problema: não é fácil fazer as contas. Ver #16 .

luismrsilva commented 9 years ago

Ideia: usar módulo da velocidade pra mudar a altura da camara.

nuno-silva commented 9 years ago

Eis a minha soluçao.

void CarCamera::update() {
    const auto xy_offset = _car->getOrientation().normalized()
                            * _car->_bottom_length * (-3);

    const auto z_offset  = Vector3( 0, 0,
                            (_car->_bottom_height + _car->_top_height) * 2 );

    setPosition(_car->getPosition() + xy_offset + z_offset);
    setCenter(_car->getPosition() + _car->getOrientation());
    Camera::update(); // calculate matrixes
}

Sendo orientation a orientação do carro, ou seja, um vetor que diz:

Tendo em conta que não têm o vetor orientation, a solução do @luismrsilva não me parece muito má.

luismrsilva commented 9 years ago

Ficou fácil de fazer depois de resolver o #16.

Agora a posição da câmara é:

            pos                                 // pos do carro
        +   Vector3(0, 0, 0.3 + speed*0.25)     // aumeta Z com a velocidade
        -   speed_v * 0.5                       // afasta-se com a velocidade
        -   Vector3(0.5, _car->getXYAngle()     // mantem distancia minima ao carro

Ou seja, a câmara segue o carro com uma distância mínima de 0.5. Para além disso, afasta-se do carro à medida que a velocidade aumenta (com fator de 0.5). No Z, tem altura mínima de 0.3 e sobre com o módulo da velocidade (com fator de 0.25).