作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 德尔福 XE4 (update1) 和 FMX , 我要 移动相机使用此代码(在滚轮鼠标事件内):
AVector := Vector3D(0, 0, 3);
Camera.Position.Vector.AddVector3D(AVector);
Camera.Position.Vector
值(value)
不变 .
AVector := Vector3D(0, 0, 3);
Camera.Position.Vector := Camera.Position.Vector + AVector;
AddVector3D()
一样奇怪函数正是执行此代码!
procedure TVector3D.AddVector3D(const AVector3D: TVector3D);
begin
Self := Self + AVector3D;
end;
最佳答案
Camera.Position
是 TPosition3D
类型.和TPosition3D.Vector
是 TVector3D
类型的属性有一个 setter/getter 和一个二传手。请注意 TVector3D
是一条记录,它是值类型而不是引用类型。这个细节至关重要。
所以,当你写 Camera.Position.Vector
您指的是向量的副本。这是一个副本,因为 TVector3D
是一个值类型。
因此,非工作代码相当于:
var
TempVec: TVector3D;
....
TempVec := Camera.Position.Vector;
TempVec.AddVector3D(...);
AddVector3D
不会修改
Camera.Position
因为调用
AddVector3D
只是改变临时本地。
Vector
进行赋值。属性,这正是工作代码所做的。
AddVector3D
这样的变异实例方法。 ,
Normalize
,
Scale
等等。这种方法会导致这种困惑。相反,使用返回新值的函数可以更好地实现该功能,就像重载运算符一样。
关于delphi - TVector3D.AddVector3D 不起作用(对我来说),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17844149/
我是一名优秀的程序员,十分优秀!