TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua

 找回密码
 新人加入
查看: 3933|回复: 2
打印 上一主题 下一主题

[已解决] 求获取frz旋转后坐标的方法 [复制链接]

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

楼主
发表于 2011-11-17 19:05:48 |显示全部楼层
空间解析几何坐标变换公式 (如果单是frz的话, 平面解析几何就足够了)




其中, x, y为原pos, theta为旋转角度

下面这个是相关的VSFilter的源代码片段
  1. void CWord::Transform(CPoint org)
  2. {
  3.         double scalex = m_style.fontScaleX/100;
  4.         double scaley = m_style.fontScaleY/100;

  5.         double caz = cos((3.1415/180)*m_style.fontAngleZ);
  6.         double saz = sin((3.1415/180)*m_style.fontAngleZ);
  7.         double cax = cos((3.1415/180)*m_style.fontAngleX);
  8.         double sax = sin((3.1415/180)*m_style.fontAngleX);
  9.         double cay = cos((3.1415/180)*m_style.fontAngleY);
  10.         double say = sin((3.1415/180)*m_style.fontAngleY);

  11.         for(int i = 0; i < mPathPoints; i++)
  12.         {
  13.                 double x, y, z, xx, yy, zz;

  14.                 x = scalex * (mpPathPoints[i].x + m_style.fontShiftX * mpPathPoints[i].y) - org.x;
  15.                 y = scaley * (mpPathPoints[i].y + m_style.fontShiftY * mpPathPoints[i].x) - org.y;
  16.                 z = 0;

  17.                 xx = x*caz + y*saz;
  18.                 yy = -(x*saz - y*caz);
  19.                 zz = z;

  20.                 x = xx;
  21.                 y = yy*cax + zz*sax;
  22.                 z = yy*sax - zz*cax;

  23.                 xx = x*cay + z*say;
  24.                 yy = y;
  25.                 zz = x*say - z*cay;

  26.                 zz = max(zz, -19000);

  27.                 x = (xx * 20000) / (zz + 20000);
  28.                 y = (yy * 20000) / (zz + 20000);

  29.                 mpPathPoints[i].x = (LONG)(x + org.x + 0.5);
  30.                 mpPathPoints[i].y = (LONG)(y + org.y + 0.5);
  31.         }
  32. }
复制代码
参考链接:

http://zh.wikipedia.org/wiki/%E6%97%8B%E8%BD%AC

http://zhidao.baidu.com/question/31601042


Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

沙发
发表于 2011-11-17 21:29:43 |显示全部楼层
我们的夏天 发表于 2011-11-17 21:13
呃,度娘知道的那个参考页面里评论说该公式只适用于逆时针旋转,悲剧的是恰好旋转角是负的。。。
加之数学矩 ...


正负不影响吧, 如果是负数, sin(-30) = -sin(30), cos(-30) = cos(30), 公式不变....

p.s. 其实-30和330是等价的(360-30)

p.s.2. 可以参考萌葬给的那函数....

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

板凳
发表于 2011-11-18 02:43:19 |显示全部楼层
round是圆滑取整函数,5大概表示四舍五入?可以用 int(x+0.5) 代替…
不过pos接受浮点数的…可以不用取整…

三角函数一般还是用弧度制的…角度制用起来不太方便

p.s. 公式粗略看了下,应该是正确的

p.s.2. 萌葬用python很长时间了 XD
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-5-4 13:18

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH