Wyznaczanie wektora odbitego

Wyznaczanie wektora odbitego to podstawa przy programowaniu fizyki etc.

Najpierw funkcja
zwraca ona wektor odbity o długości 1

void vectorReflect( const double fVec[ 3 ] , const double fNormal[ 3 ] , double fOut[ 3 ] ){
	double fVecCopy[ 3 ];
	double fNormalCopy[ 3 ];

	fVecCopy[ 0 ]	=	fVec[ 0 ];
	fVecCopy[ 1 ]	=	fVec[ 1 ];
	fVecCopy[ 2 ]	=	fVec[ 2 ];

	fNormalCopy[ 0 ]	=	fNormal[ 0 ];
	fNormalCopy[ 1 ]	=	fNormal[ 1 ];
	fNormalCopy[ 2 ]	=	fNormal[ 2 ];

	// wyznaczanie długości wektorów
	double fVecCopyLen	=	sqrt( fVecCopy[ 0 ] * fVecCopy[ 0 ] + fVecCopy[ 1 ] * fVecCopy[ 1 ] + fVecCopy[ 2 ] * fVecCopy[ 2 ] );
	double fNormalCopyLen	=	sqrt( fNormalCopy[ 0 ] * fNormalCopy[ 0 ] + fNormalCopy[ 1 ] * fNormalCopy[ 1 ] + fNormalCopy[ 2 ] * fNormalCopy[ 2 ] );
	// normalizacja wektorów
	fVecCopy[ 0 ]		/=	fVecCopyLen;
	fVecCopy[ 1 ]		/=	fVecCopyLen;
	fVecCopy[ 2 ]		/=	fVecCopyLen;

	fNormalCopy[ 0 ]	/=	fNormalCopyLen;
	fNormalCopy[ 1 ]	/=	fNormalCopyLen;
	fNormalCopy[ 2 ]	/=	fNormalCopyLen;

	double fTmp[ 3 ];
	// wyznaczanie iloczynu skalarnego
	double fDot	=	fVecCopy[ 0 ] * fNormalCopy[ 0 ] + fVecCopy[ 1 ] * fNormalCopy[ 1 ] + fVecCopy[ 2 ] * fNormalCopy[ 2 ];

	fTmp[ 0 ]	=	fNormalCopy[ 0 ] * fDot;
	fTmp[ 1 ]	=	fNormalCopy[ 1 ] * fDot;
	fTmp[ 2 ]	=	fNormalCopy[ 2 ] * fDot;

	fTmp[ 0 ]	*=	2.0;
	fTmp[ 1 ]	*=	2.0;
	fTmp[ 2 ]	*=	2.0;

	fOut[ 0 ]	=	fVecCopy[ 0 ] - fTmp[ 0 ];
	fOut[ 1 ]	=	fVecCopy[ 1 ] - fTmp[ 1 ];
	fOut[ 2 ]	=	fVecCopy[ 2 ] - fTmp[ 2 ];
}

a teraz skąd to się wzięło
1 parametr to wektor padający drugi to wektor normalny czyli wektor prostopadły do powierzchni , 3 parametr to tablica 3 elementowa w której zostanie zapisany wektor odbity

na początku normalizujemy wektory ( normalizacja to podzielnie składowych wektora przez jego długość przez co otrzymujemy wektor którego długość wynosi 1 )

U to wektor normalny V to wektor padający
zaczepiamy teraz wektor U i V w tym samym punkcie

rzutujemy teraz V na U dzięki czemu otrzymamy wektor W

jak łatwo teraz można zauważyć jeśli od wektora V odejmiemy dwa razy wektor W ( wektor W możemy po prostu pomnożyć przez 2 i odejmować tylko raz ) to otrzymamy wektor odbity

Dodaj komentarz