famo.us 透视如何工作?
how does famo.us perpective work?
我正在尝试了解 famo.us 透视变换的工作原理。
我假设famo.us使用单点透视,这意味着新图像只是平面(一些具有不同z坐标的平面)与从焦点到原始图像的线的交点。
我还假设声明 context.setPerspective(100)
设置了焦点到原始图像(屏幕)的距离。
这意味着图像的 Transform.translate(0, 0, -50)
应该使新图像小 2 倍,但事实并非如此!!
我在 famo.us 文档中没有找到任何关于此的信息。
有什么想法吗?
P.S:我需要计算平移距离以用图像填充屏幕宽度(而且我不想使用比例尺)。
透视与 3D space 相关,并且相对于以像素为单位的原点。首先,您应该为您的观点使用更大的值(比如 1000)。其次,使用修饰符设置表面相对于上下文的平移。正值使元素更靠近观察者,负值则更远。
注意:将您的 translateZ 值移动一半不会改变您的表面大小!从您的角度来看,它只会沿着原点轴将其移动得更近或更远。 运行 下面的示例并将翻译更改为 -1000,您将看到。
var mainContext = Engine.createContext();
var contextPerspective = 1000;
mainContext.setPerspective(contextPerspective);
var surface = new Surface({
content: 'Background',
transform: Transform.translate(0, 0, 0.002),
properties: {
backgroundColor: 'rgba(0,0,0,0.1)'
}
});
var surfacemod = new Modifier({
origin: [0.5, 0.5],
align: [0.5, 0.5]
});
mainContext.add(surfacemod).add(surface);
surfacemod.setTransform(Transform.translate(0, 0, -500));
编辑:根据上下文的宽度查找 z 变换值
Example jsBin(宽度)
Example jsBin(图像宽度或高度基于上下文大小)
var surfacemod = new Modifier({
size: [200, 100],
origin: [0.5, 0.5],
align: [0.5, 0.5]
});
var contextSize = mainContext.getSize();
var surfaceSize = surface.getSize();
var percentage = (contextSize[0]- surfaceSize[0]) / contextSize[0];
var transZ = contextPerspective * percentage;
surfacemod.setTransform(Transform.translate(0, 0, transZ));
我正在尝试了解 famo.us 透视变换的工作原理。
我假设famo.us使用单点透视,这意味着新图像只是平面(一些具有不同z坐标的平面)与从焦点到原始图像的线的交点。
我还假设声明 context.setPerspective(100)
设置了焦点到原始图像(屏幕)的距离。
这意味着图像的 Transform.translate(0, 0, -50)
应该使新图像小 2 倍,但事实并非如此!!
我在 famo.us 文档中没有找到任何关于此的信息。
有什么想法吗?
P.S:我需要计算平移距离以用图像填充屏幕宽度(而且我不想使用比例尺)。
透视与 3D space 相关,并且相对于以像素为单位的原点。首先,您应该为您的观点使用更大的值(比如 1000)。其次,使用修饰符设置表面相对于上下文的平移。正值使元素更靠近观察者,负值则更远。
注意:将您的 translateZ 值移动一半不会改变您的表面大小!从您的角度来看,它只会沿着原点轴将其移动得更近或更远。 运行 下面的示例并将翻译更改为 -1000,您将看到。
var mainContext = Engine.createContext();
var contextPerspective = 1000;
mainContext.setPerspective(contextPerspective);
var surface = new Surface({
content: 'Background',
transform: Transform.translate(0, 0, 0.002),
properties: {
backgroundColor: 'rgba(0,0,0,0.1)'
}
});
var surfacemod = new Modifier({
origin: [0.5, 0.5],
align: [0.5, 0.5]
});
mainContext.add(surfacemod).add(surface);
surfacemod.setTransform(Transform.translate(0, 0, -500));
编辑:根据上下文的宽度查找 z 变换值
Example jsBin(宽度)
Example jsBin(图像宽度或高度基于上下文大小)
var surfacemod = new Modifier({
size: [200, 100],
origin: [0.5, 0.5],
align: [0.5, 0.5]
});
var contextSize = mainContext.getSize();
var surfaceSize = surface.getSize();
var percentage = (contextSize[0]- surfaceSize[0]) / contextSize[0];
var transZ = contextPerspective * percentage;
surfacemod.setTransform(Transform.translate(0, 0, transZ));