Текстуры

Автор Тема: Текстуры  (Прочитано 7045 раз)

0 Пользователей и 5 Гостей просматривают эту тему.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Текстуры
« : 13-02-2019, 14:09:08 »
Здравствуйте.
Помогите создать текстуру (материал). Не могу добраться до определенного свойства
Код - vb.net [Выбрать]
  1. Public Shared Function FuncCreateMaterial(ByVal nameMaterial As String, ByVal textureImageFilePath As String, ByVal height As Integer) As ObjectId
  2.         Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
  3.         Dim acCurDb As Database = acDoc.Database
  4.         Dim imgWidth As Integer = 1
  5.         Dim imgHeight As Integer = 1
  6.         textureImageFilePath = textureImageFilePath & nameMaterial & ".jpg"
  7.         Using fs As FileStream = New FileStream(textureImageFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
  8.             Using img As System.Drawing.Image = System.Drawing.Image.FromStream(fs)
  9.                 imgHeight = img.Size.Height
  10.                 imgWidth = img.Size.Width
  11.             End Using
  12.         End Using
  13.         FuncCreateMaterial = Nothing
  14.         Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  15.             Try
  16.                 Dim acBlkTbl As BlockTable = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  17.                 Dim acBlkTblRec As BlockTableRecord = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  18.                 Dim matLib As DBDictionary = acTrans.GetObject(acDoc.Database.MaterialDictionaryId, OpenMode.ForRead)
  19.                 If matLib.Contains(nameMaterial) = False Then
  20.                     Dim tex As ImageFileTexture = New ImageFileTexture()
  21.                     tex.SourceFileName = textureImageFilePath
  22.                     Dim uScale As Double = 1
  23.                     Dim vScale As Double = 1 / height
  24.                     Dim uOffset As Double = 0
  25.                     Dim vOffset As Double = 0
  26.                     Dim mx As Matrix3d = New Matrix3d(New Double() {uScale, 0, 0, uScale * uOffset, 0, vScale, 0, vScale * vOffset, 0, 0, 1, 0, 0, 0, 0, 1})
  27.                     Dim mapper As Mapper = New Mapper(Projection.Cylinder, Tiling.Crop, Tiling.Crop, AutoTransform.None, mx)
  28.                     Dim map As MaterialMap = New MaterialMap(Source.File, tex, 1.0, mapper)
  29.                     Dim mdc As MaterialDiffuseComponent = New MaterialDiffuseComponent(New MaterialColor(), map)
  30.                     Dim mrc As MaterialRefractionComponent = New MaterialRefractionComponent(2.0, map)
  31.                     Dim mat As Material = New Material()
  32.                     mat.Name = nameMaterial
  33.                     mat.Diffuse = mdc
  34.                     mat.Refraction = mrc
  35.                     mat.Mode = Mode.Realistic
  36.                     mat.Reflectivity = 1.0
  37.                     mat.IlluminationModel = IlluminationModel.BlinnShader
  38.                     matLib.UpgradeOpen()
  39.                     FuncCreateMaterial = matLib.SetAt(nameMaterial, mat)
  40.                     acTrans.AddNewlyCreatedDBObject(mat, True)
  41.                     acTrans.Commit()
  42.                     FuncCreateMaterial = mat.Id
  43.                 Else
  44.                     For Each idMat As DBDictionaryEntry In matLib
  45.                         Dim matStr As String = idMat.Key
  46.                         If matStr Like nameMaterial Then
  47.                             FuncCreateMaterial = idMat.Value
  48.                         End If
  49.                     Next
  50.                 End If
  51.             Catch
  52.                 Exit Function
  53.             End Try
  54.         End Using
  55.     End Function





« Последнее редактирование: 13-02-2019, 15:57:25 от Захаров Максим »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Текстуры
« Ответ #1 : 13-02-2019, 16:03:12 »
Не могу добраться до определенного свойства
Какого свойства?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Текстуры
« Ответ #2 : 13-02-2019, 16:16:54 »
Я выделил на картинке. Первое это мне не изменить свойство ПОВТОР. По горизонтали и по вертикали мне надо поставить "Плитка".
А второе - это получить доступ к сцене - и поставить значение "Плоскость". Я думал это делает строка
Код - vb.net [Выбрать]
  1. Dim mapper As Mapper = New Mapper(Projection.Planar, Tiling.Crop, Tiling.Crop, AutoTransform.None, mx)
но оказывается нет

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Текстуры
« Ответ #3 : 13-02-2019, 16:23:28 »
Tiling.Crop
Или всё-таки Tiling.Tile - тебе же нужно включить повтор?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Текстуры
« Ответ #4 : 13-02-2019, 16:36:34 »
А второе - это получить доступ к сцене - и поставить значение "Плоскость". Я думал это делает строка
Вообще-то Сцена->Плоскость (Scene->Plane) - это лишь для отображения в Редакторе материалов. К самому материалу это отношения не имеет и не настраивается через API.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Текстуры
« Ответ #5 : 13-02-2019, 17:06:29 »
Спасибо Александр.
Да действительно если поставить Tiling.Tile то значение становится правильным. Но почему то текстуры искажаются. Если это свойство в ручную поставить то все ок. Хотя все остальное не меняется

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Текстуры
« Ответ #6 : 13-02-2019, 17:13:24 »


Если сделать строку
Код - vb.net [Выбрать]
  1. Dim mapper As Mapper = New Mapper(Projection.Cylinder, Tiling.Tile, Tiling.Tile, AutoTransform.Model, mx)
В этом случае свойство ПОВТОР принимает значение "Плитка". Но искажаются текстуры. Меняешь свойство ПОВТОР (в ручную) на "нет", а потом снова на "Плитка" и все нормально.
Странно

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Текстуры
« Ответ #7 : 13-02-2019, 17:38:40 »
Попробуй Tiling.InheritTiling
Тут только экспериментировать, так как ничего не документировано.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Текстуры
« Ответ #8 : 13-02-2019, 18:03:43 »
Да спасибо Александр.
Я уже и так экспериментирую. Похоже сами материалы создаются правильно. Искажения идут когда я начинаю материал присваивать объекту. Если материал присваивать в ручную то все ок.
Т.е. я на первом этапе создаю материал средствами NET. Потом в этом же коде присваиваю его Solid3D (SolidObj.Material = NameTextures). И похоже здесь что то не идет. Я уже по разным транзакциям это разнес. В ручную созданный материал работает.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Текстуры
« Ответ #9 : 13-02-2019, 18:46:03 »
Захаров Максим,
В твоём коде acTrans.Commit() выполняется не всегда. Обрати на это внимание.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Текстуры
« Ответ #10 : 14-02-2019, 17:26:34 »
Потом в этом же коде присваиваю его Solid3D (SolidObj.Material = NameTextures)
Как я понимаю этого недостаточно. Нужно задать еще SolidObj.MaterialMapper, как в этом примере: https://adndevblog.typepad.com/autocad/2013/07/applying-material-to-a-cylinder.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Текстуры
« Ответ #11 : 15-02-2019, 13:40:14 »
Да Александр, я уже поправил код.
Код - vb.net [Выбрать]
  1. SolidObj.Material = NameTextures
  2. Dim Mapper As Mapper = New Mapper(Projection.Box, Tiling.InheritTiling, Tiling.InheritTiling, AutoTransform.InheritAutoTransform, Matrix3d.Identity)
Но все равно немного не то.
Вы не подскажите как мне поработать с последним аргументом (Matrix3d.Identity). Что это, и как ее задавать. Когда накладываешь созданный материал средствами автокад и потом смотришь свойства mapper в режиме отладки, то там матрица с непонятными мне коэффициентами. Если оставить Matrix3d.Identity то будет просто единичная матрица и поэтому текстура размывается.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Текстуры
« Ответ #12 : 15-02-2019, 16:24:25 »
Когда накладываешь созданный материал средствами автокад и потом смотришь свойства mapper в режиме отладки, то там матрица с непонятными мне коэффициентами.
Анализируй эти коэффициенты. Посмотри вот эту статью: https://adndevblog.typepad.com/autocad/2014/08/decomposing-material-mapper-transform-matrix.html
В ней разбираются составляющие этой матрицы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение