Выявил интересную особенность в 3D моделировании на C#. Оказалось, что порядок загрузки объектов имеет особое значение. Например. Загружаем сналача объект БТР, а после него загружаем прозрачную сферу. Получаем такую картину:
А вот такую картину получим, если БТР загрузить в последнюю очередь:
Интересно. Получается, что видимые объекты через сферу определяются в момент её загрузки, а не во время рендеринга? Или я что не допонимаю?
А вот это, вообще ни в какие рамки не лезет. Загружаем вертолёт, естественно после загрузки ландшафта. Если смотреть снаружи в лобовуху вертика, то видно поверхность ландшафта:
Хотя внутри полигоны также установлены:
Если с первым случаем както можно смириться, то здесь вообще фигня какаято получается.
Сообщение было успешно отредактировано singapur22 (08-03-2010 11:32 GMT3 часа, назад) Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Нда - сказать что-то определенное тоже не могу.
Кстати с двумерными объектами как то наоборот получается - более младший потомок имеет большой приоритет видимости чем более старший. То есть когда инициализируешь кнопки -в одинаковых координатах (одну под другой) - видимой будет та что дальше от корня (верха окна - а деревья насколько, я помню, в программировании растут от верха к низу)
У тебя нет рабочего примера рисования куба?
С методами вчера вроде немного разобрался - однако че-нить нарисовать не получается - выходит вовсе не трехмерный объект - пробовал пару примеров - и видимость вовсе не та что ожидалась мною.
Есть вообще разница между использованием для отрисовки Viewbox и Viewport3D ? используется как я заметил иногда и виевбокс.
Куб как я понял рисуется Rect3D - но в какие теги его заключать?
Скажем всегда ли надо начинать инициализацию с тегов
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
(камеру в самом начале тегов опускаем как само собой разумеющееся)
и далее опять <ModelVisual3D>
<ModelVisual3D.Content>
и после
<GeometryModel3D>
<GeometryModel3D.Geometry>
далее меш с координатами - а куб куда надо будет вписывать?
<MeshGeometry3D все параметры/>
и далее материал. (или группа материалов - трансформацию пока не трогаем)
И такой вопрос - без материала объект будет невидим?
добавлено спустя 27 минут
Вот смотри - взял такой пример - я его сократил- убрал трансформацию и градиентную заливку
Отображается просто квадрат. А не куб. А как должно?
erlik Естественно у тебя будет отображаться только квадрат, так как треугольники ты установил только на одну сторону (два штуки). А должно быть (количество сторон * 2). Тоесть, для каждой стороны куба, 2 треугольника. Это раз. Второе, треугольники указываются не простым вводом используемых вертексов, а упорядочиванием вертексов в треугольники. Втретих, при создании вертексов, указываются не координаты сторон, а координаты углов объекта. Тоесть, у куба не 6 вертексов, а 8.
Далее, при указании треугольников, нужно отсортировать вертексы так, чтобы треугольники не пересекались и каждый треугольник смотрел наружу, а не внутрь. Чтобы треугольник смотрел наружу, вертексы для него указываются против часовой стрелки, относительно лицевой стороны плоскости. В данном случае порядок будет такой:
ЦитатаИ такой вопрос - без материала объект будет невидим?
Если честно, не пробывал. Но вместо текстуры можно указать цвет заливки.
P.S. Разобрался с файлами obj. Подправил парсер.dll, теперь можно подключать любые файлы obj.
Оказалось, что полигон и треугольник это разные вещи. Точнее вещь то одна и таже, но полигоны, в отличии от треугольников имеют прямоугольную форму и заключают в себе два треугольника. Нужно было лишь разбить полигон на два треугольника.
Сообщение было успешно отредактировано singapur22 (08-03-2010 16:07 GMT3 часа, назад) Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Окей. Спасибо. Буду сейчас разбираться.
Устанавливал то не я - я просто пример взял - хотел увидеть наглядное изображение. Написано было что куб а уж в кол-ве вертексов не разбирался.
А сейчас скачал готовый проект с двумя кубами - которые еще на маус даун реагируют - вот там все нормально два кубика цветных - которые еще и вращаются на нажатие.
Теперь надо разбираться как координаты правильно назначать - в этом пока мало что понимаю.
добавлено спустя 6 минут
для создания 3D объекта получается достаточно двух параметров
TriangleIndices и Positions
даже нормали не обязательны - у двух кубов которые я скачал нормали не указаны.
а в материале да просто заливка указана <DiffuseMaterial x:Name="cube1Material" Brush="Blue" />
Сообщение было успешно отредактировано erlik (08-03-2010 16:13 GMT3 часа, назад) Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
erlik Координаты указываются относительно центра оси будущего объекта, в метрах. Соответственно без установки перемещения объекта, ось объекта будет приравнена к оси мирового пространства. Чтобы объект после создания переместить в нужную координату нужно использовать соответствующий метод перемещения TranslateTransform3D().
добавлено спустя 3 минут
Нормали нужны для правильной отрисовки освещения DirectionalLight , PointLight, и SpotLight. Если используется освещение AmbientLight, то нормали не нужны, так как производится полное освещение.
Графически эта разница выглядит так:
поверхность без установленных нормалей:
поверхность с установленными нормалями по направлению к источнику света (направление примерное):
Как видишь, разница существенная.
Сообщение было успешно отредактировано singapur22 (08-03-2010 16:35 GMT3 часа, назад) Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Да с методами transform все более менее понятно - я их с 2D объектами всяко разно использовал - у меня в моем плеере (до сих не рабочим в плане звука) внутри летает куча объектов (треугольники, квадраты, эллипсы, полилайны ) по самым безбашенным траекториям.
применял все четыре трансформации - и всяко разно анимирвал - получилось прикольно.
теперь хочу тож самое сделать и с 3D - но как рисовать (в плане координат) вот это пока не понял.
освещение мне пока без надобности -поэтому значит нормали не нужны.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
ЦитатаОпределяет элемент оформления содержимого, который позволяет растягивать и масштабировать один дочерний элемент для заполнения свободного пространства.
Соответственно, в данном случае он бессмыслен, так как Viewport3D, помимо своих, имеет те же самые свойства.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Заработал у меня плеер. Оказывается надо было установить 10 версию или выше Windows Media Player - так как Windows Presentation Foundation для воспроизведения файла запускает в фоновом режиме исполнимый модуль этого проигрывателя.
Почему не ниже 10 версии фиг знает - но у меня явно ниже была. Я то по наивности полагал что у меня винда давно обновила его до последней версии - оказалось фиг вам. Пришлось скачивать.
Замучился с этим слайдером прокрутки - не хочет работать как надо. если ставлю на таймер для автоматического движения по ходу воспроизведения он на первой секунде туда-сюда дергается.И музыка также. А перемотка движением ползунка начинает воспроизведение сначала.
добавлено спустя 9 минут
перемотку вот так делал
Код:
//получаем позицию слайдера
double pos = slider2.Value;
//получаем общую проддолжительность медиа файла
Duration dur = pleer.NaturalDuration;
if (dur.ToString() != "Automatic")
{
double d = pleer.NaturalDuration.TimeSpan.TotalSeconds;
даже без конвертации работает
pleer.Position = TimeSpan.FromSeconds(slider2.Value * pleer.NaturalDuration.TimeSpan.TotalSeconds);
и автоматическое движение ползунка тоже теперь пашет.
Осталось как то вывести в текстблок полное время (NaturalDuration) айдиофайла.
А то пока там у меня только время по ходу воспроизведения.
Вот блин - зато теперь пауза не работает при автоматическом движении ползунка. А на стоп все сначала начинается. Надо как у тебя проверок понаставить
Сообщение было успешно отредактировано erlik (09-03-2010 23:24 GMT3 часа, назад) Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
erlik Вот и отлично. А я снова переключился на 3D. Пытаюсь произвести полный парсер файлов *.obj, и прилагающиеся к ним файлы материала *.mtl
Разобрался с *.obj уже на 90%. Остаются только две неясности, которые в принципе никакого значения в данном случае не имеют. Но хотелось бы с ними разобраться, для общего развития. Думаю, в последствии ответы найдутся сами собой.
С *.mtl пока разбор произведён на 15%
Единственное, что я смог оттуда выпарсить, это пути к текстурам и цвета заливок:
newmtl 01___Default
Ns 10.00
Ni 1.50
d 1.00
Tr 0.00
Tf 1.00 1.00 1.00
illum 2
Ka 0.00 0.00 0.00
Kd 0.59 0.59 0.59 --основной цвет заливки Ks 0.00 0.00 0.00
Ke 0.00 0.00 0.00
map_Ka D:\Resources\textures\fx_lavahell1.png --? map_Kd D:\Resources\textures\fx_lavahell1.png --путь к основной текстуре
Остальное пока под вопросом.
Сообщение было успешно отредактировано singapur22 (09-03-2010 23:54 GMT3 часа, назад) Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
так вроде настроил. А теперь вопрос дня: а плейлист то как реализовать? С самого начала знал что это будет самое сложное - но так как пришлось решать проблемы другого свойства - алгоритм так и не составил...
добавлено спустя 2 минут
singapur22
дак а сам что не рисуешь 3D-шки?
....Знаю знаю - очень сложно - пытался вот вчера пирамидку фигову нарисовать и то не вышло. Пока не вышло.
Сообщение было успешно отредактировано erlik (09-03-2010 23:51 GMT3 часа, назад) Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Да не реально всё это. Можно конечно нарисовать простые примитивы. Но не более. Более сложные объекты создаю в 3DsMax, экспортирую их в формат obj и подключаю к C#. Вот этот путь я и пытаюсь воссоздать. Существует ещё возможность сохранения анимации для экспортированного объекта в отдельном файле. Но этим я займусь после решения назначенных в настоящий момент задач.
С плэй листом не сильно сложно. У меня есть тестовый плеер (создавал ещё в первые дни изучения) на основе WindowsForms. Там мне удалось создать плэйлист, со всеми нужными событиями (переключение на следующую композицию при завершении текущей, автозапуск с первой композиции, навигация по плэйлисту, и т.д. и т.п) Если нужно, могу скинуть исходник.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Понятно. Ну я примитивы хочу пока освоить, а там поглядим что будет дальше интересно.
Исходник, конечно скидывай - а то я пока вообще не представляю как это делается.
добавлено спустя 2 минут
кстати почему в этом опен диалоге нельзя выделить сразу несколько файлов? Когда виндовский плеер открываешь - там в окне диалога можно скока хочешь файлов выделить для загрузки - а здесь только один. Странно.
Сообщение было успешно отредактировано erlik (10-03-2010 00:14 GMT3 часа, назад) Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
singapur22
спасибо.
Так и думал что Multiselect нужно в труе выставить.
...начал ковырять класс Forms и увидел что там немало неизвестных мне компонентов - надо будет опробовать.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
erlik А то. Я с WindowsForms и начинал. С ним гораздо проще работать. Даже в свойствах компонентов, в отличии от Wpf, для каждого элемента выводятся описания и допустимые значения.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Сделал плейлист правда пришлось чуток помучиться.
метод AddRange - есть у кого угодно, но только не у класса контролс.
для листбокса класса контролс пришлось так делать
string[] fnames = OpenDialog.FileNames;
foreach (string x in fnames)
{
box.Items.Add(x);
}
Но я не понял почему в позициях отображается не только имя композиции, а весь путь к ней?
(заменил листбокс на комбо - он как то лучше смотрится)
Сообщение было успешно отредактировано erlik (10-03-2010 19:23 GMT3 часа, назад) Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
erlik А чё тут не понятного? OpenDialog возвращает пути к файлам, позволяющий наблюдать их визуально. Этим всё и объясняется. Если хочешь вывести только названия файлов, то используй парсер строк string.Split(...):
Код:
string[] fnames = OpenDialog.FileNames;
string[] separator = new string[] { @"\" } //массив разделителей, нам нужен только один.
foreach (string x in fnames)
{
string[] ElementsPath = x.Split(separator, System.StringSplitOptions.RemoveEmptyEntries);
box.Items.Add(ElementsPath.Length - 1);
...
}
Данный метод Split(...), возвращает строковый массив, содержащий подстроки строки, над которой производится операция, разделённые элементами заданного массива строк = separator.
Соответственно, понадобится дополнительный виртуальный список, который будет содержать полные пути к файлам под теми же индексами, что и названия файлов в списке box. Дабы можно было открывать файлы при операциях в онном.
Сообщение было успешно отредактировано singapur22 (11-03-2010 15:29 GMT3 часа, назад) Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
А как сохранять нужные данные? допустим ту же табличку с путями файлов - чтобы при загрузке приложения плейлист автоматом заполнялся теми файлами которые туда были записаны в прошлый раз.
Методов сохранения пока вообще нигде не встречал - в каком неймспейс их искать?
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Кстати. А ты с пространством имён System.IO.IsolatedStorage не работал? Содержит классы и методы управления изолированными файлами. В частности (создание, запись, чтение).
Сообщение было успешно отредактировано singapur22 (11-03-2010 21:46 GMT3 часа, назад) Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
erlik А других способов и не имеется. В любом случае, во всех медиаплеерах для этого создаются плэйлисты в виде файлов, содержащие в себе пути к выбранным медиафайлам. Да и вообще, как ты представляешь себе сохранение данных без создания отдельного файла при закрытии програмки?
Ты с пространством имён System.IO.IsolatedStorage не работал? Содержит классы и методы управления изолированными файлами. В частности (создание, запись, чтение). Пытаюсь с ним щас работать. Выявляется много непонятков.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Да в том то и дело что никак не представляю потому и спрашивал. Запись в файл это первое что мне в голову пришло - но я подумал что это наверно не то...
IsolatedStorage в первый раз слышу - и даже найти пока не могу среди IO .
я пока чтением и записью в xml занимался - чтение просто, а вот создать объемный xml через процедурный код - совсем другая история. вручную куда легче...
добавлено спустя 2 минут
ага так это значит отдельное namespase - а не член IO .
Сообщение было успешно отредактировано erlik (11-03-2010 22:29 GMT3 часа, назад) Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
IsolatedStorage -- плохо искал. Это одно из пространств имён сборки mscorlib, как и недавно изученный тобой Collections.Generic.
Основные классы:
System.IO.IsolatedStorage.IsolatedStorage -- Представляет область изолированного хранения, содержащую файлы и папки.
System.IO.IsolatedStorage.IsolatedStorageFileStream -- Представляет файл в изолированном хранении.
Основная непонятка. Где производится сохранение? И как попасть в данную область изолированного хранения из консоли Windows? Просмотрел весь скрытый AppData, но созданной мной области я там не нашол. Хотя прога мою область находит. Возникает вопрос. Где именно сохраняется изолированная область, если не в AppData?
Цитатаага так это значит отдельное namespase - а не член IO .
Эх ты. Я же тебе сказал, что это пространство имён, а не член IO.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
IsolatedStorageScope.Roaming -- Изолированное хранилище может быть помещено в расположение файловой системы, способной перемещаться (если разрешено перемещение данных пользователя в основной операционной системе).
Это что же получается? Изолированное хранилище вообще не относится к файловой системе Windows, а представляет собственную (индивидуальную) файловую систему? Если так, то всё понятно и имеющиеся вопросы отпадают сами собой.
добавлено спустя 13 минут
erlik
AppData -- скрытая папка в User.
Причина ошибки в том, что такие пути не поддерживаются данным классом. Вот мой пример:
//записываем в файл один бит данных.
ISFS.WriteByte(220);
//закрываем файл. Операция обязательна, для сохранения данных.
ISFS.Close();
//снова открываем файл.
ISFS = new IsolatedStorageFileStream(
"arhive\\data.txt",
System.IO.FileMode.Open);
//считываем с файла один бит данных
int i = ISFS.ReadByte();
//выводим данные в консоль
Console.WriteLine(i);
//притормазим выполнение программы
Console.ReadKey();
Сообщение было успешно отредактировано singapur22 (11-03-2010 23:41 GMT3 часа, назад) Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
че то у меня и такой путь не хочет поддерживаться
нашел шаблоны путей - но нифига не понял
это для XP
Перемещаемые хранилища =
<КОРНЕВАЯ ПАПКА>\Profiles\<пользователь>\Application Data
Неперемещаемые хранилища =
<КОРНЕВАЯ ПАПКА>\Profiles\<пользователь>\Local Settings\Application Data
А если Profiles - то бишь профилей у меня на компе нет? и пользователь соответственно я один - то как тогда?
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
singapur22
сделал немного по другому - теперь не ругается
IsolatedStorageFile isofile = IsolatedStorageFile.GetStore(IsolatedStorageScope.User |
IsolatedStorageScope.Assembly |
IsolatedStorageScope.Roaming,
null,
null);
isofile.CreateDirectory("mydir");
IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("test.doc", FileMode.Create, isofile);
добавлено спустя 21 минут
ну наконец то получилось целый файл записать в хранилище.
добавлено спустя 14 минут
а файл оказался у меня по такому пути
C:\Documents and Settings\@\Application Data\IsolatedStorage\Url.fw4jkawu35hbvafpykoqe5knorspinji\AssemFiles\
а если еще директорию свою указывать "mydir\\test.doc"
тогда еще и в ней.
Сообщение было успешно отредактировано erlik (12-03-2010 01:09 GMT3 часа, назад) Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.