Shadows on plane - Тени на плоскости
To anyone who have been doing some raytracing-programming, this shouldnt be a major problem. But to all of the rest out there, you might not have a single clue. Well, its all about math really, you dont need to implement a great deal. Actually, we cant just take a whole object and then just cast shadows on a plane, we need to take every vertex, and project thison the plane. Thereby we get a whole new set of fasestructures, which have been altered a great deal, to fit the plane, sort of doing 2d projection on another plane than the screen. Now, what we have to do, is to define a plane. How can we do this, you might ask, well, we need this formular:
Любой, кто программировал трассировку лучей, это не должно быть большая задача. Но другие могут и не иметь таких сведений. Отлично, относительно математики, Вы не должны выполнить много. Фактически, мы не можем только брать целый объект и затем только переводить тени на плоскости, мы должны брать каждую вершину, и проектировать их на плоскости. Вследствие этого мы получаем целое новое множество структур граней, которые были изменены в большом количестве, для того чтобы прилаживать на плоскость, сортировка делается в 2D проекции на плоскости другой чем экран. Теперь, что мы должны делать, для того чтобы определить плоскость. Как мы может делать это, Вы могли бы спрашивать, хорошо, мы нуждаемся в этой формуле:
AX + BY + CZ + D = 0
Or или
AX + BY + CZ = -D
Now, A, B, C and D are definitions of how much the plane tip, and to what side etc. Next, we also need a vector, a vector which goes from the lightsource, to the point which you wish to project (your vertex). This should be made by saying:
Теперь, A, B, C и D - определяют наклон плоскости, и какая сторона и т.д. Затем, мы также нуждаемся в векторе, который идет из источника освещения, к точке, которую Вы желаете спроектировать (ваша вершина). Это должно быть сделано так:
vx = lightsource.x - vertex.x
vy = lightsource.y - vertex.y
vz = lightsource.z - vertex.z
Now, many might not know of it, but a vector in 3d-space are not defined the same way as a 2d line, its defined using a t-value. Every vector have a startingpoint (or a basis-point) from which it origns and then it has its pitch and its t-value. The pitch-value are multiplied with the t-value, and added to the basispoint, to get a position on the line. It looks like this:
Теперь, многие могли и не знать это, но вектор в 3d-пространстве не определен тем же самым способом как 2D линия, определение вектора в 3D предполагает использование t-значения. Каждый вектор имеет начальную точку (или точка базиса) из которого он начинается и затем он имеет приращение и это и есть t-значение. Значение приращения умножено на t-значение, и добавлено к начальной точке, для того чтобы получить позицию на линии. Это походит на это:
[X] [dX]
3d vector = [Y] + t * [dY]
[Z] [dZ]
Where dx,dy and dz are the direction of the vector, and X,Y and Z are the orign of the vector. Now, what we basicly need to do now, is to figure out, what t value to put into this equation, so that the point we get out, matches a point on the plane. Or in other words; the point on the plane matching this line, are a certain amount of t's away from the orign of the vector, and this t-value we wish to find. Now, the orign point of the vector are either lightsource.xyz or vertex.xyz, it doesnt matter, as long as it doesnt change, while calculating (you aren't allowed to change the orign of the vector, nor the direction). The direction (dx,dy,dz) are the vector which you calculated above, direction = lightource-vertex.
Где dx, dy и dz - направление вектора, и X, Y и Z - начало вектора. Теперь, что мы просто должны делать теперь, так это должны выяснить, как t-значение помещать в это уравнение, так, чтобы из точки из которой мы выходим, соответствовала точка на плоскости. Или другими словами; точка на плоскости, соответствует этой линии, является некоторым количеством t's от начала вектора, и это t-значение, которое мы желаем найти. Теперь, точка начала вектора является или lightsource.xyz или vertex.xyz, это не имеет значение, пока это не изменяется, в то время как при вычислении (Вам не позволяют изменить начало вектора, ни направления). Направление (dx, dy, dz) - вектор, который Вы вычислили выше, direction = lightource-vertex.
Okay, now thats setled, we can start on the plane. We have to define our plane, but how can we do this? Simple, we have two vectors and an orign point. Think about it for a while, if you have two vectors, which have a 90 degress angle between eachother, and an end-point which also are equal to eachother, you can define any plane you'd like. Actually the two vectors arent forced to be 90 degress between them, but it helps in imagining the process. To illustrate, take out a piece of paper, blank. Now, pick a corner, and make this your orign. Now the two sides which both have the same orign, are your vectors. You can move these two, and thereby creating any plane you'd like, still having the same orign point. So, 2 vectors and a orign can make it up for a plane. So, all we have to do now, is to translate the information we have, into a plane-equation.
Отлично, теперь когда это улаженно, мы можем начинать с плоскости. Мы должны определить нашу плоскость, но как мы можем делать это? Просто, мы имеем два вектора и точку начала. Думайте относительно этого некоторое время, если Вы имеете два вектора, которые имеют между друг другом 90 градусов, и конечная точка, которая также являются равными друг другу, Вы можете определять любую плоскость, которую вы хотели бы. Фактически между двумя векторами необязательно может быть 90 градусов, но это помогает в воображении процесса. Для иллюстрации, возьмите лист бумаги, чистой. Теперь, выберите угол на этой бумаге, и сделайте это угол вашим началом. Теперь две стороны, которыми оба имеют то же самое начало(этот угол), определяют ваши вектора. Вы можете перемещать эти два вектора, и вследствие этого можете создать любую плоскость, которую вы хотели бы, все еще имея ту же самую точку начала. Так, 2 вектора и точка начала могут определить плоскость. Так, все мы должны делать теперь, должен перенести информацию, которую мы имеем, в уравнение плоскости.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.