Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Alexey191295
0 / 0 / 0
Регистрация: 27.09.2013
Сообщений: 1
#1

RayCasting для пола

30.09.2013, 15:03. Просмотров 668. Ответов 0
Метки нет (Все метки)

Здравствуйте, я решил попробовать для интереса сделать простенькую 3d игрушку, но с использованием только процессора. Выбрал метод бросания лучей, прекрасно нарисовал им стены, но никак не могу понять как рисовать пол и потолок. Помогите пожалуйста.
Вот так я бросаю лучи:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
private void castSingleRay(float rayAngle, Map map, int stripIdx)
        {
            float angleSin, angleCos, dist, xHit, yHit, textureX, slope, dX, dY, x, y, distX, distY;
 
            rayAngle %= twoPI;
            if (rayAngle < 0f) rayAngle += twoPI;
 
            bool right = (rayAngle > twoPI * 0.75f || rayAngle < twoPI * 0.25f);
            bool up = (rayAngle < 0f || rayAngle > PI);
 
            angleSin = (float)Math.Sin(rayAngle);
            angleCos = (float)Math.Cos(rayAngle);
 
            dist = 0;   // the distance to the block we hit
            xHit = 0;   // the x and y coord of where the ray hit the block
            yHit = 0;
 
            textureX = 0f;  // the x-coord on the texture of the block, ie. what part of the texture are we going to render
            int wallX;  // the (x,y) map coords of the block
            int wallY;
 
            slope = angleSin / angleCos;    // the slope of the straight line made by the ray
            dX = right ? 1f : -1f;  // we move either 1 map unit to the left or right
            dY = dX * slope;        // how much to move up or down
 
            x = right ? (float)Math.Ceiling(_player.x) : (float)Math.Floor(_player.x);  // starting horizontal position, at one of the edges of the current map block
            y = _player.y + (x - _player.x) * slope;            // starting vertical position. We add the small horizontal step we just made, multiplied by the slope.
 
            while (x >= 0f && x < map.Width && y >= 0f && y < map.Height)
            {
                wallX = (int)(x + (right ? 0 : -1));
                wallY = (int)y;
 
                if (map[wallY, wallX] > 0)
                {
                    distX = x - _player.x;
                    distY = y - _player.y;
                    dist = distX * distX + distY * distY;   // the distance from the player to this point, squared.
 
                    textureX = y % 1f;  // where exactly are we on the wall? textureX is the x coordinate on the texture that we'll use when texturing the wall.
                    if (!right) textureX = 1f - textureX; // if we're looking to the left side of the map, the texture should be reversed
 
                    xHit = x;   // save the coordinates of the hit. We only really use these to draw the rays on minimap.
                    yHit = y;
                    break;
                }
                x += dX;
                y += dY;
            }
 
            slope = angleCos / angleSin;
            dY = up ? -1f : 1f;
            dX = dY * slope;
            y = up ? (float)Math.Floor(_player.y) : (float)Math.Ceiling(_player.y);
            x = _player.x + (y - _player.y) * slope;
 
            while (x >= 0 && x < map.Width && y >= 0 && y < map.Height)
            {
                wallY = (int)(y + (up ? -1 : 0));
                wallX = (int)x;
                if (map[wallY, wallX] > 0)
                {
                    distX = x - _player.x;
                    distY = y - _player.y;
                    float blockDist = distX * distX + distY * distY;
                    if (dist <= 0f || blockDist < dist)
                    {
                        dist = blockDist;
                        xHit = x;
                        yHit = y;
                        textureX = x % 1f;
                        if (up) textureX = 1f - textureX;
                    }
                    break;
                }
                x += dX;
                y += dY;
            }
 
            if (dist > 0.1f)
            {
                dist = Approximate.Sqrt2(dist);
                dist = dist * (float)Math.Cos(_player.rot - rayAngle);
                // now calc the position, height and width of the wall strip
                // "real" wall height in the game world is 1 unit, the distance from the player to the screen is viewDist,
                // thus the height on the screen is equal to wall_height_real * viewDist / dist
                float height = (float)Math.Round(viewDist / dist);
 
                // width is the same, but we have to stretch the texture to a factor of stripWidth to make it fill the strip correctly
                float width = height * stripWidth;
 
                // top placement is easy since everything is centered on the x-axis, so we simply move
                // it half way down the screen and then half the wall height back up.
                float top = (float)Math.Round((screenHeight - height) / 2f);
 
                int texX = (int)Math.Round(textureX * img.Width);
                if (texX > img.Width - stripWidth)
                    texX = img.Width - stripWidth;
 
 
                Rectangle posRect = new Rectangle(stripIdx * stripWidth, (int)top, stripWidth, (int)height);
 
                int r = (int)(dist * 32f);
                if (r > 255)
                    r = 255;
 
                graphics.DrawImage(img, posRect, texX, Color.FromArgb(255 - r, 255 - r, 255 - r));
            }
        }
Делал я не полностью сам, а по вот этому уроку: http://dev.opera.com/articles/view/c...-html-5-can-1/

Вот так у меня получилось:

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Миниатюры
RayCasting для пола  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2013, 15:03
Ответы с готовыми решениями:

Распознавание людей с учетом их пола на изображении
Существуют ли готовые библиотеки/инструменты для этого? Мне нужно ряд...

Вывод студентов указанного пола: найти ошибку
нужно чтобы по нажатию кнопки выводились студенты с указанным полом в...

Валидация пола
Здравствуйте, форумчане, нужна ваша помощь. Нужно сделать чтобы в консольном...

Из списка записать в файл работников мужского пола
Доброго времени суток! Подскажите, пожалуйста, есть такая: задача вводится...

Изменить пола одного класса методами другого класса так, чтобы изменения сохранились в первом классе
Есть простая форма с текстбоксом и тремя кнопками. Нужно следующее: Нажимаем на...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2013, 15:03

Raycasting вычисления
Делаю игру на openGL и джава. Сейчас пытаюсь сделать воксельный движок, но не...

Задание условия для вывода студентов заданного пола
Как задать условие, чтобы на экран выводились студенты заданного пола? осталось...

Определить максимальный и минимальный стаж для сотрудников каждой должности и пола
Прикладываю файл с начатым выполнением, помогите дальше сделать 25. Определить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru