【问题标题】:How to modify the code written in old Firemonkey 3D?如何修改用旧 Firemonkey 3D 编写的代码?
【发布时间】:2014-11-19 06:34:02
【问题描述】:

我刚刚下载了一个如何开始使用 FireMonkey 3D 的示例,但无法重新编译在早期 Delphi 版本上编写的两个代码部分(我使用的是 Delphi XE6):

第一部分

[dcc32 Error] Unit1.pas(168): E2003 Undeclared identifier: 'Material'

var
  Mesh1: TMesh;
  BMP: TBitmap;
//....
Mesh1.Material.Texture := BMP;

第二部分,错误:

[dcc32 错误] Unit1.pas(221): E2003 未声明的标识符:'Vector3DAdd'

[dcc32 错误] Unit1.pas(222): E2003 未声明的标识符:'Vector3DScale'

var
Camera1: TCamera;
//....
Camera1.Position.Vector := Vector3DAdd(Camera1.Position.Vector, Vector3DScale(Vector3D(0, 0, 1), (WheelDelta / 120) * 0.3));

如何更改它才能在新的Delphi版本下编译? 整个单位:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UIConsts, System.UITypes, System.Classes, System.Variants, FMX.Types,
  FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Objects3D, FMX.Types3D, FMX.Layouts, FMX.Layers3D,
  System.Math.Vectors, FMX.Controls3D, FMX.MaterialSources, FMX.StdCtrls, FMX.Forms3D, FMX.Graphics;

type
  TForm1 = class(TForm3D)
    Camera1: TCamera;
    Mesh1: TMesh;
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure GenerateMesh(Func: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses Math;

var
  Down: TPointF;

procedure TForm1.GenerateMesh(Func: Integer);
var
  BMP: TBitmap;
  BD: TBitmapData;
  k: Integer;
begin
  Mesh1.Data.Clear;


  BMP := TBitmap.Create(1, 360);
  BMP.Map(TMapAccess.ReadWrite, BD);
  for k := 0 to 359 do
    BD.SetPixel(0, k, CorrectColor(HSLtoRGB(k / 360, 0.75, 0.5)));
  BMP.Unmap(BD);

//  Mesh1.Material.Texture := BMP;
end;

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer;
  var Handled: Boolean);
begin
//  Camera1.Position.Vector := Vector3DAdd(Camera1.Position.Vector,
//    Vector3DScale(Vector3D(0, 0, 1), (WheelDelta / 120) * 0.3));
end;

end.

【问题讨论】:

  • 如果您能解释您发布的代码存在什么问题,这将非常有帮助。你得到什么编译器错误?您是否查看过 XE6 中的源代码或文档,看看您是否能弄明白?你下载的代码是为什么版本的Delphi编写的?
  • 是的,当然,忘了这个,问题被修改了。
  • 是的,明白了:),我刚刚上传了整个演示项目。链接在问题中。
  • 抱歉,我刚刚检查了链接(我将它上传到了 yandex.ru),它工作正常。现在我会把它上传到其他地方。
  • 我删除了所有不必要的代码,并注释了无法编译的两部分。

标签: delphi 3d firemonkey


【解决方案1】:

1) 你需要维护一个TTextureMaterialSource 组件,将所需的位图分配给后者的Texture 属性,并将对材质源组件的引用分配给相机的MaterialSource 属性。

2) 使用+* 运算符:

var
  Camera1: TCamera;
//....
  Camera1.Position.Vector := Camera1.Position.Vector +
    Vector3D(0, 0, 1) * ((WheelDelta / 120) * 0.3);

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    相关资源
    最近更新 更多