Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/32: Рейтинг темы: голосов - 32, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
1

DirectX: Как динамически создавать простые 3d объекты

01.10.2012, 23:08. Показов 5880. Ответов 39
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Помогите, пожалуйста!
Как создать приложение на Visual C# с использованием DirectX?
Должен быть реализован следующий функционал:
– в форме есть какой-нибудь контрол (Button, MenuItem...) по активации которого создается 3d mesh (Box, с передаваемыми классу размерами и bitmap'om). При чем Bitmap накладывается только на одну грань BOx'а. Либо – mesh, читаемый из файла *.x (в этом случае в класс передается iageKey из imageList, соответствующий имени файла).
- должна быть реализована возможность перемещать мышкой создаваемые объекты по оси Х (очень желательно с автоповоротом на 90 градусов после пересечения условного начала координат в центре экрана).
Перемещать = перетаскивать (drag).

Создать подобное получилось, но ТОЛЬКО для одного конкретного объекта.
А как создавать их динамически?

Добавлено через 58 минут
Вот, что удалось пока сделать...


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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
 
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
 
 
namespace Idea_DX
{
    public partial class Form1 : Form
 
    {
        Device d3d = null; // Устройство для отображения 3D-графики
        Mesh teapot = null; // Модель чайника
        Material teapotMaterial; // Материал из которого изготовлен чайник
        DateTime startTime; // Время начала анимации
        Texture teapotTexture = null; // Текстура для чайника
       
        Boolean Dragging;
        Point StartDragPoint;
        Point EndDragPoint;
        float DeltaZ = 0;
        float DeltaZConst = 0;
 
        float DeltaX = 0;
        float DeltaXConst = 0;
 
        public static Vector3 BoxTo = new Vector3(2, 2, 2);
 
        const double TeapotRotationX = 0.2;
        const double TeapotRotationY = 0.1;
 
        public Form1()
        {
            InitializeComponent();
            SetStyle(ControlStyles.ResizeRedraw, true);
            // Устанавливаем режим обновления окна
            SetStyle(ControlStyles.Opaque, true);
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        }
 
        public void OnIdle(object sender, EventArgs e)
        {
            Invalidate(); // Помечаем главное окно (this) как требующее перерисовки
        }
 
 
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                startTime = DateTime.Now; // Засекаем время начала анимации
                // Устанавливаем режим отображения трехмерной графики
                PresentParameters d3dpp = new PresentParameters();
                d3dpp.BackBufferCount = 1;
                d3dpp.SwapEffect = SwapEffect.Discard;
                d3dpp.Windowed = true; // Выводим графику в окно
                d3dpp.MultiSample = MultiSampleType.None; // Выключаем антиалиасинг
                d3dpp.EnableAutoDepthStencil = true; // Разрешаем создание z-буфера
                d3dpp.AutoDepthStencilFormat = DepthFormat.D16; // Z-буфер в 16 бит
                d3d = new Device(0, // D3D_ADAPTER_DEFAULT - видеоадаптер по умолчанию
                DeviceType.Hardware, // Тип устройства - аппаратный ускоритель
                this, // Окно для вывода графики
                CreateFlags.SoftwareVertexProcessing, // Геометрию обрабатывает CPU
                d3dpp);
                // Создаем модель чайника и задаем ее свойства
                teapot = Mesh.Box(d3d, 4, 12, 8);
            //    teapot = Mesh.FromFile("tekh.x", MeshFlags.SoftwareProcessing, d3d);
                
                teapotMaterial = new Material();
                
 
                teapotMaterial.Diffuse = Color.Cornsilk;
                teapotMaterial.Specular = Color.White;
            }
            catch (Exception exc)
            {
                MessageBox.Show(this, exc.Message, "Ошибка инициализации");
                Close(); // Закрываем окно
            }
 
 
            // Загружаем текстуру для чайника из файла с именем spheremap.bmp
            using (FileStream textureFile =
            new FileStream("rose.bmp", FileMode.Open))
            {
                teapotTexture = Texture.FromStream(d3d,
                textureFile, // Поток данных с текстурой
                0, // Будем использовать как обычную текстуру
                Pool.Managed); // Область памяти для размещения текстуры
                textureFile.Close();
 
 
            }
        }
 
       
 
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
 
            // Замеряем интервал времени между отрисовкой этого кадра и началом анимации
            DateTime currTime = DateTime.Now;
            TimeSpan totalTime = currTime - startTime;
            double totalSeconds = totalTime.TotalSeconds;
            
            
            
            // Очищаем буфер глубины и дублирующий буфер
            d3d.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.CadetBlue, 1.0f, 0);
 
            // Начинаем отрисовку кадра
            d3d.BeginScene();
 
            // Устанавливаем параметры источника освещения
d3d.Lights[0].Enabled = true; // Включаем нулевой источник освещения
d3d.Lights[0].Diffuse = Color.White; // Цвет источника освещения
d3d.Lights[0].Position = new Vector3(0,0,0); // Задаем координаты
 
            
 
d3d.Material = teapotMaterial; // Устанавливаем материал для чайника
 
            // Задаем матрицу проецирования
            d3d.Transform.Projection = Matrix.PerspectiveFovLH(
            (float)Math.PI / 2, // Угол зрения
            Width / (float)Height, // Отношение высоты и ширины окна
            0.1f, 105f); // Диапазон изменения координаты z
            // Задаем матрицу преобразования мировых координат для чайника:
            // сдвиг на 3.5 условные единицы :) по оси z от наблюдателя
 
 
 
        
 
            d3d.Transform.World = Matrix.Translation(0, 0, 3.5f);
 
 
            // Отключаем отсечение нелицевых граней
            //         d3d.RenderState.CullMode = Cull.None;
            // Задаем матрицу преобразования для чайника
            d3d.Transform.World =
            Matrix.RotationX((float)(totalSeconds * TeapotRotationX * 0 * Math.PI)) *
            Matrix.RotationY((float)(totalSeconds * TeapotRotationY * Math.PI/2)) *
            Matrix.Translation(DeltaZConst + DeltaZ + 0, -20, -DeltaXConst - DeltaX + 85f);
        //    Matrix.Translation(DeltaZConst + DeltaZ + 0, -15, 105f);
 
            // Выключаем текстурирование
            d3d.SetTexture(0, null);
 
   /*         // В качестве текстурных координат берем вектор нормали
d3d.TextureState[0].TextureCoordinateIndex = (int)TextureCoordinateIndex.CameraSpaceNormal;
// Преобразуем текстурные координаты по заданным формулам
d3d.Transform.Texture0 = Matrix.Scaling(1, 1, 1) *
Matrix.Translation(1, 1, 1);
// Передаем блоку растеризации две текстурные координаты
d3d.TextureState[0].TextureTransform = TextureTransform.Count2;
// Устанавливаем текстурк
d3d.SetTexture(0,teapotTexture);
 
// Включаем билинейную фильтрацию текстур
d3d.SamplerState[0].MinFilter = TextureFilter.Linear;
d3d.SamplerState[0].MagFilter = TextureFilter.Linear;
            */
 
 
 
            // Рисуем чайник
            teapot.DrawSubset(0);
            // Завершаем отрисовку кадра
            d3d.EndScene();
 
            //.Показываем содержимое дублирующего буфера
            d3d.Present();
        }
 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            Dragging = true;
            StartDragPoint = e.Location;
        }
 
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (Dragging)
            {
                DeltaZ = 1 + (e.Location.X - StartDragPoint.X)/6;
                DeltaX = 1 + (e.Location.Y - StartDragPoint.Y) /6;
                       
            }
 
        }
 
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            if (Dragging)
            {
                Dragging = false;
                EndDragPoint = e.Location;
                DeltaZConst += DeltaZ;
                DeltaZ = 0;
                DeltaXConst += DeltaX;
                DeltaX = 0;
                
                
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            
        }
 
 
    }
}
Добавлено через 47 минут
Возможно, кто-нибудь знает подходящий источник или урок?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2012, 23:08
Ответы с готовыми решениями:

Как динамически создавать визуальные обьекты?
Как динамически создавать визуальные обьекты? Например radio button...

Как в ASP.net динамически создавать label-ы?
000

[WPF] Как динамически создавать графические элементы и как с ними работать?
Здравствуйте! Я не очень понимаю как динамически в C# создавать графические элементы и как с...

Как динамически создавать объекты класса ?
Всем привет! У меня есть файл app.config в котором хранится информация о точках. У каждой точки 3...

39
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
02.10.2012, 21:25  [ТС] 21
Author24 — интернет-сервис помощи студентам
Kp0c, физика? Я думаю, что не в полной мере. Гравитации точно не нужно. Кубы могут висеть, но не не пересекать друг ддруга
0
13 / 13 / 0
Регистрация: 06.06.2012
Сообщений: 81
02.10.2012, 22:00 22
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
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
 
public GameObject block;
public Material mat_blue;
public Material mat_red;
// Use this for initialization
void Start () {
  Screen.showCursor = false;
}
 
// Update is called once per frame
void Update () {
  Ray ray = Camera.mainCamera.ScreenPointToRay(new Vector3(Screen.width/2,Screen.height/2,0));
  RaycastHit hit;
 
  if(Physics.Raycast(ray,out hit,5f) && hit.collider.tag == "Block")
  {  
   if(Input.GetMouseButtonUp(0))
   {
        Vector3 pos = hit.collider.transform.position;
        pos += hit.normal;
  
        Instantiate(block,pos,Quaternion.identity);
   }
   else if(Input.GetKeyUp (KeyCode.E))
   {
        DestroyObject(hit.collider.gameObject);
   }
  }else if(Physics.Raycast(ray,out hit,5f) && hit.collider.name == "Plane")
  {
  
   if(Input.GetMouseButtonUp(0))
   {
        Vector3 pos = hit.point;
        pos.y = 0;
        pos.x = Mathf.Round(pos.x);
        pos.z = Mathf.Round(pos.z);
  
        Instantiate(block,pos,Quaternion.identity);
   }
  }
}
 
void OnGUI()
{
  if(Input.GetKey(KeyCode.M))
  {
   Screen.showCursor = true;
  
   GUILayout.BeginVertical();
   GUILayout.Label(block.renderer.sharedMaterial.name + "");
  
   if(GUILayout.Button("Blue"))
   {
        block.renderer.sharedMaterial = mat_blue;
   }
   if(GUILayout.Button("Red"))
   {
        block.renderer.sharedMaterial = mat_red;
   }
   GUILayout.EndVertical();
  }
  else
  {
   Screen.showCursor = false;
  }
}
}
Пока-что без перетаскивание, но как ни как что-то есть
1
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
02.10.2012, 22:03  [ТС] 23
Kp0c,
Огромное спасибо!!!
Мне теперь следует выполнить Assets - Create - C# Script ? в пустом проекте?
0
13 / 13 / 0
Регистрация: 06.06.2012
Сообщений: 81
02.10.2012, 22:07 24
да, потом из Standart Assets перетаскиваете First Person Controller и на него бросаете скрипт
1
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
02.10.2012, 22:07  [ТС] 25
Kp0c,
сейчас попробую!
0
13 / 13 / 0
Регистрация: 06.06.2012
Сообщений: 81
02.10.2012, 22:25 26
также нужно создать префаб куба у которого будет тэг"Block" и plane у которого тэг "plane"(плейн вместо земли)

Добавлено через 17 минут
Ну все, я пойду спать, сомневаюсь что смогу помочь с передвижением так как у меня плохо с перехватыванием позиции мышки в 3д пространстве , завтра в школе подумаю над этим
1
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
02.10.2012, 22:26  [ТС] 27
Kp0c,
Еще раз - СПАСИБО!
Пробую запустить!
0
13 / 13 / 0
Регистрация: 06.06.2012
Сообщений: 81
02.10.2012, 22:55 28
Цитата Сообщение от borman-kama Посмотреть сообщение
Kp0c,
Еще раз - СПАСИБО!
Пробую запустить!
отпишитесь о успехах
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
02.10.2012, 22:56  [ТС] 29
Kp0c, Обязательно отпишусь!
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
02.10.2012, 23:09  [ТС] 30
Что-то я видимо неправильно делаю...
Сейчас приложу скрин...
Миниатюры
DirectX: Как динамически создавать простые 3d объекты  
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
02.10.2012, 23:12  [ТС] 31
вот еще один..
Миниатюры
DirectX: Как динамически создавать простые 3d объекты  
0
13 / 13 / 0
Регистрация: 06.06.2012
Сообщений: 81
03.10.2012, 08:24 32
1)Plane должен быть размещен на сцене вместо земли.(GameObgect->Create->plane)
2)куб сначало нужно создать и настроить, и только потом пихать в префаб, может я прийду со школы и кину вам сцену где все правильно сделано? А Вы посмотрите как
1
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
03.10.2012, 08:35  [ТС] 33
Kp0c, Доброе утро!
Да, было бы здорово посмотреть!
Я тоже Вам выложу, что у меня получилось...
Вложения
Тип файла: rar New Unity Project 1.rar (4.13 Мб, 9 просмотров)
0
13 / 13 / 0
Регистрация: 06.06.2012
Сообщений: 81
03.10.2012, 16:50 34
Ну все, сделал, только я не уверен что так как Вам надо
Вложения
Тип файла: rar sharic.rar (8.58 Мб, 11 просмотров)
1
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
03.10.2012, 19:51  [ТС] 35
Kp0c,
Добрый вечер!
Пробую запустить! Как я понял там VS Project даже есть? Здорово!

Добавлено через 8 минут
Kp0c, не запускается... В Unity просто пустая сцена... А в Visual Studio ошибка... Скрин сейчас приложу..
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
03.10.2012, 19:55  [ТС] 36
вот скрин студии..
Миниатюры
DirectX: Как динамически создавать простые 3d объекты  
0
13 / 13 / 0
Регистрация: 06.06.2012
Сообщений: 81
03.10.2012, 19:58 37
Вы вместе с Юнити устанавливали MonoDevelop?

Добавлено через 42 секунды
попробуйте в папке "_уровни" открыть сцену "test"

Добавлено через 1 минуту
А VS Project, без Unity не стоит открывать
1
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
03.10.2012, 20:00  [ТС] 38
Kp0c, MonoDevelp установлен...
Я так и попробовал - в папке "_уровни" открыл сцену "test"..
0
13 / 13 / 0
Регистрация: 06.06.2012
Сообщений: 81
03.10.2012, 20:09 39
и что, сцена пустая?

Добавлено через 3 минуты
Ааааа понял походу что не так, что-бы открыть проект сделайте так: File->Open Project-> и там выберите папку с этим проектом. Это самый правильный способ открытия.
1
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 26
03.10.2012, 20:17  [ТС] 40
Kp0c,
я уже и скомпилировал, все равно пусто
0
03.10.2012, 20:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2012, 20:17
Помогаю со студенческими работами здесь

Как создавать объекты на основе считанной инфы из текстового файла
Доброго времени суток, столкнулся с такой проблемой: Как создавать на основе считанных данных...

Как описать простые объекты?
Например: - женщины, мужчины (с именем, фамилией, датой рождения и тд) - они могут, жениться,...

Как создавать объекты из XML файла, если каких то атрибутов может не быть?
Создаю объекты из XML файла: List<Terminal> terminals = new List<Terminal>(); ...

Как правильно создавать объекты на форме?
Задача следующей программы рисовать гибкий график функции на поле класса PictureBox. Для этого я...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru