C++ HLSL的所有三角函数都使用弧度吗?如何旋转图像?
我在所有可用文档中搜索该问题的答案:Microsoft、wiki和手册之外的文档。C++ HLSL的所有三角函数都使用弧度吗?如何旋转图像?,c++,hlsl,C++,Hlsl,我在所有可用文档中搜索该问题的答案:Microsoft、wiki和手册之外的文档。 “HLSL的所有三角函数都使用弧度吗?” 我刚刚在Microsoft发现函数的参数必须是: 每个组件都应该是-1范围内的浮点值 对1 但它没有说,如果是弧度或梯度 例如,我有顶点着色器和坐标。 我需要将图片旋转10°。 我通过常量缓冲区传递10作为参数:fzAngle=10。 我使用极坐标系的变换。 以下代码正确吗 顶点着色器 float fzRadAngle = radians(fzAngle); float2
“HLSL的所有三角函数都使用弧度吗?”
我刚刚在Microsoft发现函数的参数必须是: 每个组件都应该是-1范围内的浮点值 对1 但它没有说,如果是弧度或梯度 例如,我有顶点着色器和坐标。
我需要将图片旋转10°。
我通过常量缓冲区传递10作为参数:
fzAngle
=10。我使用极坐标系的变换。
以下代码正确吗 顶点着色器
float fzRadAngle = radians(fzAngle);
float2 ptPos = input.Pos.xy;
float polarAngle = atan(ptPos.y / ptPos.x);
float polarRadius = sqrt(pow(ptPos.x, 2) + pow(ptPos.y, 2));
polarAngle += fzRadAngle;
ptPos.x = polarRadius * cos(polarAngle);
ptPos.y = polarRadius * sin(polarAngle);
output.Pos.xy = ptPos.xy;
return output;
UPD那么旋转呢。。。即使我不旋转,只是在坐标系之间转换,我也会得到超出范围的图像(它会从目标纹理中消失)
如我所见,半径计算中的问题,因此,如果我操作ro,我会恢复原来的图像:
float fzRadAngle = radians(fzAngle);
float2 ptPos = input.Pos.xy;
float x = ptPos.x;
float y = ptPos.y;
float phita = atan(y / x);
y = x * tan(phita);
ptPos.x = x;
ptPos.y = y;
output.Pos.xy = ptPos.xy;
return output;
UPD
我发现了一些有趣的东西
坐标系:
[-1, 1, -1, 1]
如果出现此代码,图片不变:
float2 ptPos = input.Pos.xy;
float x = ptPos.x;
float y = ptPos.y;
float phita = atan(y / x);
float ro = sqrt(pow(x, 2) + pow(y, 2));
y = x * tan(phita);
ptPos.x = x;
ptPos.y = y;
output.Pos.xy = ptPos.xy;
return output;
在这种情况下,它排除了:
float2 ptPos = input.Pos.xy;
float x = ptPos.x;
float y = ptPos.y;
float phita = atan(y / x);
float ro = sqrt(pow(x, 2) + pow(y, 2));
x = ro * cos(phita);
y = ro * sin(phita);
ptPos.x = x;
ptPos.y = y;
output.Pos.xy = ptPos.xy;
return output;
即使我尝试从x
和y
的结束值添加/子结构1或0.5,也无法将图像返回到视图字段
在这里,我只是尝试从Decart系统转换到polar系统,然后再转换回来。基本上所有东西都使用弧度。你能把他们说的-1和1联系起来吗?因为这绝对不适用于三角功能。数学专家通常使用弧度。C++数学/三重函数也适用,这是大多数编程语言的标准。
cos()
和sin()
函数的结果在-1到1的范围内,但对于其他trig函数(如tan()
)或trig函数的逆函数,情况并非如此。这是acos
页面所说的,也是asin
页面应该说的(该页面错误),但不是sin
页面所说的,cos
,和tan
页面显示。他们都说“[在]指定的值,以弧度为单位”。这个页面例如:请看问题的更新。。。
float2 ptPos = input.Pos.xy;
float x = ptPos.x;
float y = ptPos.y;
float phita = atan(y / x);
float ro = sqrt(pow(x, 2) + pow(y, 2));
x = ro * cos(phita);
y = ro * sin(phita);
ptPos.x = x;
ptPos.y = y;
output.Pos.xy = ptPos.xy;
return output;