На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Как наложить текстуру на 3d модель directX?
    Добавила модель с расширением .x, на форму, теперь мне нужно наложить на эту модель текстуру.
    Вот как выглядит модель при запуске проекта в Delphi7:

    Прикреплённый файлПрикреплённый файлimg1.jpg (31,74 Кбайт, скачиваний: 106)
    А вот текстура.
    Прикреплённый файлПрикреплённый файлcyborg.jpg (30,3 Кбайт, скачиваний: 112)
    Как наложить текстуру на 3d модель, если модель с расширением .x (Mesh)? Прикладываю исходники https://disk.yandex.ru/d/jv1qBIR9hg5uDg

    "на disk.yandex потому, что установленный лимит не позволяет загрузить архив"

    Текстура находится в папке image и является bitmap (bmp).

    Также вот код:
    ExpandedWrap disabled
      unit primer;
       
      interface
       
      uses
        Windows,  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, Direct3D9, D3DX9, ExtCtrls, ComCtrls, StdCtrls, dxfunc,
        AppEvnts;
        
      type
        sVertex=record
        x,y,z:Single;
        color:DWORD;
       
      end;
        TForm1 = class(TForm)
          StatusBar1: TStatusBar;
          ApplicationEvents1: TApplicationEvents;
          Timer1: TTimer;
          procedure Timer1Timer(Sender: TObject);
          procedure FormActivate(Sender: TObject);
          procedure FormDestroy(Sender: TObject);
          procedure FormPaint(Sender: TObject);
        private
          { Private declarations }
       
        
          
         // procedure Cleanup;
        public
          { Public declarations }
        end;
       
       type
        Mesh = class
        public
          Rotate: single;
          x,y,z: Single;
          pMesh: ID3DXMesh;
          pMeshTextures:PAIDirect3DTexture9;
          pMeshMaterials:PAD3DMATERIAL9;
          dwNumMaterials: dword;
          procedure OpenMesh(NameMesh, TexturePath: String);
          procedure DrawMesh;
        end;  
       
       
       
       
      var
        Form1: TForm1;
       
         pD3DDevice:IDirect3DDevice9=nil;
       
         pD3D: IDirect3D9=nil;
         Mesh1: Mesh;
        
       
      implementation
       
       
      {$R *.dfm}
       //http://gamesmaker.ru/programming/directx/direct3d-urok-02-otobrazhenie-obektov/
       
       
      const
        D3DFVF_CustomVertex = D3DFVF_XYZ or D3DFVF_Diffuse or D3DFVF_TEX1;
       
      procedure Mesh.OpenMesh(NameMesh, TexturePath: String);
      begin
        x:=15; y:=10; z:=-50; Rotate:=0;
        dwNumMaterials:=LoadMesh(NameMesh, // TexturePath
                                 TexturePath,
                                 pD3DDevice,
                                   pMesh,
                                 pMeshTextures,
                                 pMeshMaterials );
      end;
       
      procedure Mesh.DrawMesh;
      var
        World:D3DMATRIX;
        WorldX:D3DMATRIX;
        WorldY:D3DMATRIX;
        i:Integer;
      begin
        D3DXMatrixIdentity(World);
        D3DXMatrixIdentity(WorldX);
        D3DXMatrixIdentity(WorldY);
        Rotate:=Rotate+0.009  ;
        //Поворот модели
       // D3DXMatrixRotationx(worldx,Rotate);
       // D3DXMatrixRotationy(worldy,Rotate);
        D3DXMatrixMultiply(world,worldx,worldy);
        world._41:=x; world._42:=y; world._43:=z;
        pD3DDevice.SetTransform(D3DTS_WORLD, World);
        pD3DDevice.SetRenderState(D3DRS_LIGHTING, DWORD(0));
       
        for i:=0 to dwNumMaterials-1 do
          begin
          pD3DDevice.SetTransform(D3DTS_WORLD, world);
            pD3DDevice.SetMaterial(pMeshMaterials[i]);
          if (pMeshTextures[i]<>nil) then
                pD3DDevice.SetTexture(0, pMeshTextures[i]);
          pMesh.DrawSubset(i);
          end;
      end;
       
      procedure SetupCamera;   //onoaiiaea eaia?u
      var
        ViewMatrix: TD3DMatrix;
        Eye: TD3DVector;
        At: TD3DVector;
        Up: TD3DVector;
      begin
       
        Eye.x := 10; Eye.y := 10; Eye.z := -60;
       
        At.x := 20;  At.y := 20;  At.z := 0;
       
        Up.x := 0;  Up.y := 1;  Up.z := 0;
       
        D3DXMatrixLookAtLH(ViewMatrix, Eye, At, Up);
        
        pD3DDevice.SetTransform(D3DTS_VIEW, ViewMatrix);
      end;
      procedure TForm1.Timer1Timer(Sender: TObject);
       
      begin
        pD3DDevice.Clear(1, nil, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,
                         D3DCOLOR_XRGB(0,0,0), 1.0, 0);
        pD3DDevice.BeginScene;
        Mesh1.DrawMesh;
        pD3DDevice.EndScene;
        pD3DDevice.Present(nil,nil,0,nil);
      end;
       
      procedure TForm1.FormActivate(Sender: TObject);
      begin          
        DX3DInit(pD3D,pD3DDevice,form1.Handle,800,600,D3DFMT_A8R8G8B8,false);
        SetupCamera;
        Mesh1:=Mesh.Create;
       
      end;
       
      procedure TForm1.FormDestroy(Sender: TObject);
      begin
        pD3D:=nil;
        pD3DDevice:=nil;
      end;
       
      procedure TForm1.FormPaint(Sender: TObject);
      begin
      Mesh1.OpenMesh('robot1.x','mesh\');
      Timer1.Enabled:=True;
      //D3DXLoadMeshFromXA()
      //Cleanup;
      end;
       
      end.
    Сообщение отредактировано: Katerina1993 -
      Если никто не знает может есть какая-то альтернатива, где можно добавить модель и наложить текстуру, желательно с примером, на статью?
        Просмотрев несколько учебников по С++ (так как на Delphi подходящих книг как загрузить x-mesh я не нашла), обнаружила что в коде нет явного указание пути к текстурам. И тут появилась мысль, может быть, они находятся внутри файла формата “.x” и точно, я нашла примерно такой фрагмент кода:
        Цитата

        Material {
        1.000000;1.000000;1.000000;1.000000;;
        34.560001;
        0.315000;0.315000;0.315000;;
        0.000000;0.000000;0.000000;;
        TextureFilename {
        "texture/SSR06_Born2_dif.png";
        }
        BumpMapFilename {
        "texture/SSR06_Born2_bp_base.png";
        }
        }

        И тут мне стала все понятно, оказывается у меня уже в коде Delphi прописана процедура загрузки текстуры. Просто в файле который я пыталась загрузить отсутствовали пути к текстурам.
        Занялась поисками подходящих моделей, но уже с текстурами. Результат на картинках

        Модель Меха(Робота) с текстурами.
        user posted image
        Комната с текстурами.
        user posted image
        Стена и асфальт
        user posted image
        Также вот исходники кода:
        https://disk.yandex.ru/d/uq3eLh22MYS-sg
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0287 ]   [ 18 queries used ]   [ Generated: 29.03.24, 05:18 GMT ]