Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ HLSL的所有三角函数都使用弧度吗?如何旋转图像?_C++_Hlsl - Fatal编程技术网

C++ HLSL的所有三角函数都使用弧度吗?如何旋转图像?

C++ HLSL的所有三角函数都使用弧度吗?如何旋转图像?,c++,hlsl,C++,Hlsl,我在所有可用文档中搜索该问题的答案:Microsoft、wiki和手册之外的文档。 “HLSL的所有三角函数都使用弧度吗?” 我刚刚在Microsoft发现函数的参数必须是: 每个组件都应该是-1范围内的浮点值 对1 但它没有说,如果是弧度或梯度 例如,我有顶点着色器和坐标。 我需要将图片旋转10°。 我通过常量缓冲区传递10作为参数:fzAngle=10。 我使用极坐标系的变换。 以下代码正确吗 顶点着色器 float fzRadAngle = radians(fzAngle); float2

我在所有可用文档中搜索该问题的答案:Microsoft、wiki和手册之外的文档。
“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;