0 / 0 / 0
Регистрация: 27.11.2009
Сообщений: 6
1

Создание 3d объекта

16.12.2009, 17:12. Показов 5278. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дело вот в чём сел я и нарисовал обычный треугольник по уроку из книги Managed DirectX. Проблемы конечно были с синтаксисом ! в книге написано было что функция Position используется следующим образом:
C#
1
verts[0].SetPosition(new Vector4(this.Width / 2.0f, 50.0f, 0.5f, 1.0f));
ну а на самом деле надо было писать :
C#
1
verts[0].Position = new Vector4(this.Width / 2.0f, 50.0f, 0.5f, 1.0f);
Ну да ладно, начал из 2-х мерной модели переходить в 3-х и тут на тебе ошибка!!!
Пишет что мол в функции Position должно быть не 3 а 4 элемента!
как быть????
Вот код

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
private Device device = null;
        public void InitGraph() {
            PresentParameters presentParams = new PresentParameters();
            presentParams.Windowed = true;
            presentParams.SwapEffect = SwapEffect.Discard;
            device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            device.Clear(ClearFlags.Target, System.Drawing.Color.CornflowerBlue,1.0f,0);
            device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4,
            this.Width / this.Height, 1.0f, 100.0f);
            device.Transform.View = Matrix.LookAtLH(new Vector3(0, 0, 5.0f), new Vector3(),
            new Vector3(0, 1, 0));
            device.RenderState.Lighting = false;
            device.Transform.World = Matrix.RotationZ((float)Math.PI / 6.0f);
 
            CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[3];
            verts[0].Position = new Vector4(0.0f, 1.5f, 1.0f);
            verts[0].Color = System.Drawing.Color.Aqua.ToArgb();
            verts[1].Position = new Vector4(-1.0f, -1.0f, 1.0f);
            verts[1].Color = System.Drawing.Color.Black.ToArgb();
            verts[2].Position = new Vector4(-1.0f, -1.0f, 1.0f);
            verts[2].Color = System.Drawing.Color.Purple.ToArgb();
            device.BeginScene();
            device.VertexFormat = CustomVertex.PositionColored.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleList,1,verts);
            device.EndScene();
            device.Present();
            this.Invalidate();
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque,true);
        }
 
        public static Microsoft.DirectX.Matrix LookAtLH(Microsoft.DirectX.Vector3 cameraPosition,
        Microsoft.DirectX.Vector3 cameraTarget, Microsoft.DirectX.Vector3 cameraUpVector) { 
        
        }
Также ругается на LookAtLH
Подскажите!!!

Добавлено через 36 минут
С первой ошибкой разобрался!!
Не могу понять чем его не устраивает строка
C#
1
2
3
4
public static Microsoft.DirectX.Matrix LookAtLH(Microsoft.DirectX.Vector3 cameraPosition,
        Microsoft.DirectX.Vector3 cameraTarget, Microsoft.DirectX.Vector3 cameraUpVector) { 
        
        }
0
16.12.2009, 17:12
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.12.2009, 17:12
Ответы с готовыми решениями:

Создание объекта зная тип другого объекта
К примеру, у меня есть абстрактный класс Abs, от которого унаследован класс Class1 У меня есть объект obj с типом Class1. Как имея...

Создание объекта в функции и возврат объекта из нее
Не могу разобраться с ссылками. Возможно ли вернуть из функции объект созданный в стеке при этом копи конструктор публичный. ...

Создание объекта из другого объекта
Добрый день. Теорию знаю плохо, но работаю над этим. У меня есть класс Компания и есть класс Сотрудник. Каким образом я могу в...

3
 Аватар для pigah
12 / 12 / 5
Регистрация: 05.07.2009
Сообщений: 147
Записей в блоге: 1
06.03.2010, 03:19 2
Не могу понять чем его не устраивает строка
C#
1
2
3
4
public static Microsoft.DirectX.Matrix LookAtLH(Microsoft.DirectX.Vector3 cameraPosition,
        Microsoft.DirectX.Vector3 cameraTarget, Microsoft.DirectX.Vector3 cameraUpVector) { 
        
        }
Эта строка не нужна это так выглядит функция LookAtLH
вызывать ее нужно так dev.Transform.View = Matrix.LookAtLH(new Vector3(0,3, 5.0f), new Vector3(),new Vector3(0,1,0));

Добавлено через 20 минут
Кстати книжка не очень функция для камеры должна выглядеть так:
C#
1
2
3
4
5
6
7
8
9
10
private void SetupCamera(){
            int iTime = Environment.TickCount % 1000;
            float fAngle = iTime * (2.0f * (float)Math.PI) / 1000.0f;
            dev.Transform.World = Matrix.RotationY(fAngle);
            dev.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 3.0f, -5.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
            dev.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, 1.0f, 1.0f, 100.0f);
 
            dev.RenderState.Lighting = false;
            //dev.Present();
        }
читайте MSDN))
0
 Аватар для DARK_DIESEL
2 / 2 / 0
Регистрация: 30.12.2009
Сообщений: 11
06.04.2010, 19:42 3
ВОт, у меня все работало на directXSDK 2010feb

Для файла Form1.cs
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
 
namespace DirectX_CSharp_3
{
 
    public partial class Form1 : Form
    {
        float RotateAngX, RotateAngY, RotateAngZ, PressButonX, PressButonY;
 
        private Device device = null;
        private VertexBuffer vb = null;
 
 
        /// <summary>
        /// We will initialize our graphics device here
        /// </summary>
        public void InitializeGraphics()
        {
            // Set our presentation parameters
            PresentParameters presentParams = new PresentParameters();
 
            presentParams.Windowed = true;
            presentParams.SwapEffect = SwapEffect.Discard;
 
            // Create our device
            device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
 
            vb = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, device, Usage.Dynamic |
                Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
 
            vb.Created += new EventHandler(this.OnVertexBufferCreate);
            OnVertexBufferCreate(vb, null);
        }
 
 
        private void OnVertexBufferCreate(object sender, EventArgs e)
        {
            VertexBuffer buffer = (VertexBuffer)sender;
 
            CustomVertex.PositionColored[] verts = new CustomVertex.PositionColored[3];
            verts[0].Position = new Vector3(0.0f, 1.0f, 1.0f);
            verts[0].Color = System.Drawing.Color.Red.ToArgb();
            verts[1].Position = new Vector3(-1.0f, -1.0f, 1.0f);
            verts[1].Color = System.Drawing.Color.Black.ToArgb();
            verts[2].Position = new Vector3(1.0f, -1.0f, 1.0f);
            verts[2].Color = System.Drawing.Color.Yellow.ToArgb();
 
            //device.VertexFormat = CustomVertex.PositionColored.Format;
 
            buffer.SetData(verts, 0, LockFlags.None);
        }
 
 
        private float angle=0;
        private void SetupCamera()
        {
            // Устанавливаем матрицу проецирования:
            device.Transform.Projection = Matrix.PerspectiveFovLH(
              (float)Math.PI / 4, ((float)Width) / Height, 0.5f, 100f);
            // Устанавливаем матрицу вида (положение и ориентация камеры):
            device.Transform.View = Matrix.LookAtLH(
              new Vector3(0, 0.5f, -3), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
 
            device.Transform.World = Matrix.RotationAxis(new Vector3(angle / ((float)Math.PI * 2.0f),
    angle / ((float)Math.PI * 4.0f), angle / ((float)Math.PI * 6.0f)),
    angle / (float)Math.PI);
 
            angle += 0.1f;
            
 
            //device.Transform.World = Matrix.RotationX(RotateAngX) * Matrix.RotationY(RotateAngY) * Matrix.RotationZ(RotateAngZ);
        }
 
 
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            device.Clear(ClearFlags.Target, System.Drawing.Color.CornflowerBlue, 1.0f, 0);//очищаемэкран голубым цветом
            device.RenderState.Lighting = false;//убираем освещение
         
            SetupCamera();//устанавливаем камеру
            device.RenderState.CullMode = Cull.None;//отображает заднюю часть треугольника
 
            //здаем освещение
            
            device.Lights[0].Type = LightType.Point;
            device.Lights[0].Position = new Vector3();
            device.Lights[0].Diffuse = System.Drawing.Color.White;
            device.Lights[0].Attenuation0 = 0.2f;
            device.Lights[0].Range = 10000.0f;
            device.Lights[0].Enabled = true;
            
 
            device.BeginScene();//рисуем наш треугольник
            //device.VertexFormat = CustomVertex.PositionColored.Format;
            device.VertexFormat = CustomVertex.PositionColored.Format;
  //          device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, verts);
 
            device.SetStreamSource(0, vb, 0);
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
            device.EndScene();
 
            device.Present();
 
            this.Invalidate();//Перерисовка формы
 
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
        }
 
 
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            //поворот объекта с помощью мыши
            if (e.Button.ToString() == "Left")
            {
                RotateAngY += (PressButonX - e.X)/100.0f;
                RotateAngX += (PressButonY - e.Y)/100.0f;
 
                Form1_MouseDown(sender, e);
            }
        }
 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            PressButonX = e.X;
            PressButonY = e.Y;
        }
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            switch ((int)e.KeyCode)
            {
                case 40:
                    RotateAngX += 0.1f;
                    break;
                case 38:
                    RotateAngX -= 0.1f;
                    break;
                case 37:
                    RotateAngY -= 0.1f;
                    break;
                case 39:
                    RotateAngY += 0.1f;
                    break;
            }
        }
    }
}
Для файла program.cs
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
 
namespace DirectX_CSharp_3
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            using (Form1 frm = new Form1())
            {
                // Show our form and initialize our graphics engine
                frm.Show();
                frm.InitializeGraphics();
                Application.Run(frm);
            }
   
        }
    }
}
Добавлено через 48 секунд
Кстати, как дела в обучении? До куда дошел?
0
SERGIOKA
19.01.2011, 15:50 4
А у меня почему-то работает наоборот. Когда запускаю код без настроек камеры SetupCamera(), то отображается черный треугольник. Когда с SetupCamera(), тогда вообще нет треугольника. И еще один вариант получается, если убрать SetupCamera() и оставить device.RenderState.Lighting = false то треугольник получается закрашенным как положено. В чем причина?

Добавлено через 2 часа 3 минуты
Треугольник отлично отображается и вращается без использования PerspectiveFovLH(),LookAtLH(). Как тогда работать с проекцей и камерой?

Добавлено через 22 минуты
УПС! Разобрался! Спасибо что ни кто не ответил Кое-что понял! Без явного использования PerspectiveFovLH() и LookAtLH(), перспектива и камера устанавливаются по умолчанию. Так как с использованием выше указанных методов треугольник тоже вращался но совершенно под другим углом. В коде была ошибочка, указал неверные координаты точки:
C#
1
device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 3.0f, 5.0f), new Vector3(), new Vector3(0.0f, 1.0f, 0.0f));
А нужно было:
C#
1
device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 3.0f, -5.0f), new Vector3(), new Vector3(0.0f, 1.0f, 0.0f));
Поэтому я и не видел невращающийся треугольник

Добавлено через 12 минут
Чтобы появился метод SetPosition(), нужно добавить самую старую версию References Microsoft.Direct.Direct3d.dll и Microsoft.Direct.dll. Я добавил версии 1.0.900.0.
19.01.2011, 15:50
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.01.2011, 15:50
Помогаю со студенческими работами здесь

Создание объекта 2d
Всем добрый вечер , делаю свою первую игру и хоте бы что бы мне помогли с такой задачей: есть 20 спрайтов названых от 1 до...

Создание объекта
Всем привет, нужна помощь, мне нужно сделать так чтобы объект спавнился и потом уходя за камеру удалялся, как это сделать?

Создание объекта
Может ли пользователь сам задать имя объекту? Например через prompt ввести 'Admin' и объект будет называться Admin

Создание объекта
Всем доброго вечера, подскажите: NSTimeZone *timeZone = init]; timeZone = ; Это одно и тоже? Либо я всё правильно сделал: ...

Создание объекта
Добрый вечер. Возникла проблема: есть приложение-конструктор, в которое пользователь должен иметь возможность подгружать свои детали. Не...


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Микросервис с нуля на Go с Kafka
stackoverflow 12.02.2025
Когда я впервые столкнулся с необходимостью разделить монолитное приложение на микросервисы, передо мной встал вопрос выбора правильных технологий и подходов. После долгих экспериментов с различными. . .
Микросервис с нуля на C# с RabbitMQ
stackoverflow 12.02.2025
Переход от монолитной архитектуры к микросервисной - это не просто модное веяние, а закономерный этап эволюции программных систем. В отличие от монолита, где все компоненты тесно связаны между собой. . .
Docker для начинающих
stackoverflow 12.02.2025
В современном мире разработки программного обеспечения все чаще возникает необходимость быстро и надежно разворачивать приложения в различных средах. Разработчики постоянно сталкиваются с проблемой. . .
Создание бота для Телеграм на C#
stackoverflow 12.02.2025
В современном мире корпоративных коммуникаций Telegram-боты становятся незаменимым средством автоматизации бизнес-процессов и взаимодействия с сотрудниками. Как создать такого бота, который сможет. . .
Операторы сравнения (== и ===) в JavaScript
hw_wired 12.02.2025
JavaScript предоставляет два основных оператора сравнения - оператор нестрогого равенства (==) и оператор строгого равенства (===). На первый взгляд они могут показаться очень похожими, но их. . .
Определение адреса, откуда репозиторий Git был клонирован
hw_wired 12.02.2025
Система контроля версий Git хранит всю информацию о репозитории в специальной директории . git, включая данные об удаленных источниках. Эта информация необходима для синхронизации изменений между. . .
Объединение нескольких коммитов Git в один
hw_wired 12.02.2025
Представьте, что вы работаете над новой функциональностью и создали десяток небольших коммитов: исправление опечатки, форматирование кода, добавление комментариев, реализация основной логики. Каждый. . .
Как добавить локальную ветку в удалённый репозиторий Git
hw_wired 12.02.2025
Локальная ветка в Git - это изолированная линия разработки, существующая только на вашем компьютере. Представьте себе дерево с множеством веток - каждая ветка может расти в своем направлении, не. . .
Статическое отражение в C++
stackoverflow 12.02.2025
Статическое отражение представляет собой мощный механизм, позволяющий программам анализировать и манипулировать своей собственной структурой во время компиляции. Эта возможность открывает. . .
C++ в 21 веке - Бьярне Страуструп
stackoverflow 12.02.2025
В современном мире разработки программного обеспечения C++ продолжает оставаться одним из ключевых языков программирования, несмотря на свой солидный возраст - более 45 лет с момента создания. За это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru