Como lançar raios dada uma câmera arbitrária?

votos
0

Eu estou escrevendo um traçador ray (usando coordenadas canhoto, se isso faz uma diferença). É por causa de ensinar-me os princípios, então eu não estou usando OpenGL ou características complexas como a profundidade de campo (ainda). Minha câmera pode ter uma posição arbitrária e orientação; I indicá-los por meio de três vetores, location, look_at, e sky, que se comportam como os vetores POV-Ray equivalentes . Seu filme também tem um widthe height. (O focalcomprimento é implicado pela distância entre positiona look_at.)

Meu problema é que não sei como lançar os raios. Eu tenho duas quantidades, vxe vy, que indicam onde o raio deve acabar. Ambos variam de -1 a 1. Se ambos estão -1, estou lançando o raio da posição da câmera para o canto superior esquerdo do filme; se eles são ambos 1, no canto inferior direito; se eles são ambos 0, o centro; e o resto é aparente.

Eu não estou familiarizado o suficiente com a aritmética vector para derivar uma equação para a ray. Eu apreciaria uma explicação de como fazê-lo.

Publicado 09/11/2009 em 06:18
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Você descreveu o que precisa ser feito muito bem já. Seu campo de visão é determinado pela distância entre a câmara e o "filme" que você está indo para lançar seus raios através. Quanto mais longe da câmera é a partir do filme, o mais estreito o campo de visão é.

Imaginem o filme como uma imagem bitmap que a câmera está apontando. Digamos que posicionar a unidade da câmara um longe do bitmap. Temos, então, para lançar um raio que cada um dos pixels do bitmap.

O vector é extremamente simples. Se colocarmos a localização da câmera para (0,0,0), eo filme bitmap bem na frente dela com seu centro em (0,0,1), então o raio para a direita inferior é - tada - (1, 1,1), e a outra para a esquerda inferior é (1,1,1).

Isso significa que a diferença entre o canto inferior direito e na parte inferior esquerda é (2,0,0).

Suponha que a resolução do bitmap horizontal deve ser 1000, então você pode percorrer os de fundo pixels de linha da seguinte forma:

width = 1000;
cameraToBottomLeft = (-1,1,1);
bottomLeftToBottomRight = (2,0,0);

for (x = 0; x < width; x++) {
    ray = cameraToBottomLeft + (x/width) * bottomLeftToBottomRight;
    ...
}

Se isso é claro, então você acabou de adicionar um loop externo equivalente para suas linhas, e você tem todos os raios que você irá precisar.

Você pode então adicionar variáveis ​​adequadas para a distância da câmera para o filme e resolução horizontal e vertical. Quando isso é feito, você pode começar a mudar o seu vector olhar e seu vetor com transformações de matriz.

Se você quer quebrar a cabeça em torno de computação gráfica, um livro introdutório poderia ser de grande ajuda. Eu usei este na faculdade, e eu acho que eu gostei.

Respondeu 09/11/2009 em 22:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more