glm::dot returns 一个向量
glm::dot returns a vector
我的向量声明如下:
std::vector<double> vec1;
std::vector<double> vec2;
double result = glm::dot(vec1, vec2);
我收到以下错误:error: no viable conversion from 'std::__1::vector<double, std::__1::allocator<double> >' to 'double'
在这种情况下,glm::dot
return 不应该是标量值(double
)吗?
我可能误会了,但这个错误一定来自参数类型,而不是 return 类型,glm::dot 从未将任何 std::vector 作为参数,并且因为它是不是 vec2 或 vec3 等(不是 glm 类型),它可能会尝试将其转换为 1 维值以执行 1 维标量积
只是重复上面所说的,试试这个:
glm::dvec3 vec1;
glm::dvec3 vec2;
double result = glm::dot(vec1, vec2);
正如 Guiroux 所说,第一个问题是您使用 std::vector 而不是 glm 向量(例如 vec3)。另一方面,更改后您将在 vec3 和 float
之间获得无效转换
你可以试试这个:
glm::vec3 a;
glm::vec3 b;
glm::dot<3, float, glm::qualifier::highp>(a, b);
因为 GLM 有两种方法点
template<typename T>
GLM_FUNC_QUALIFIER T dot(T x, T y)
{
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs");
return x * y;
}
template<length_t L, typename T, qualifier Q>
GLM_FUNC_QUALIFIER T dot(vec<L, T, Q> const& x, vec<L, T, Q> const& y)
{
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs");
return detail::compute_dot<vec<L, T, Q>, T, detail::is_aligned<Q>::value>::call(x, y);
}
编译器假定 T 是 vec3,因此使用第一种方法
看看这个post:
In this specific case where the generic type T is used as a parameter
for GetMax the compiler can find out automatically which data type has
to instantiate without having to explicitly specify it within angle
brackets (like we have done before specifying and ). So we
could have written instead: int i,j; GetMax (i,j);
我的向量声明如下:
std::vector<double> vec1;
std::vector<double> vec2;
double result = glm::dot(vec1, vec2);
我收到以下错误:error: no viable conversion from 'std::__1::vector<double, std::__1::allocator<double> >' to 'double'
在这种情况下,glm::dot
return 不应该是标量值(double
)吗?
我可能误会了,但这个错误一定来自参数类型,而不是 return 类型,glm::dot 从未将任何 std::vector 作为参数,并且因为它是不是 vec2 或 vec3 等(不是 glm 类型),它可能会尝试将其转换为 1 维值以执行 1 维标量积
只是重复上面所说的,试试这个:
glm::dvec3 vec1;
glm::dvec3 vec2;
double result = glm::dot(vec1, vec2);
正如 Guiroux 所说,第一个问题是您使用 std::vector 而不是 glm 向量(例如 vec3)。另一方面,更改后您将在 vec3 和 float
之间获得无效转换你可以试试这个:
glm::vec3 a;
glm::vec3 b;
glm::dot<3, float, glm::qualifier::highp>(a, b);
因为 GLM 有两种方法点
template<typename T>
GLM_FUNC_QUALIFIER T dot(T x, T y)
{
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs");
return x * y;
}
template<length_t L, typename T, qualifier Q>
GLM_FUNC_QUALIFIER T dot(vec<L, T, Q> const& x, vec<L, T, Q> const& y)
{
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs");
return detail::compute_dot<vec<L, T, Q>, T, detail::is_aligned<Q>::value>::call(x, y);
}
编译器假定 T 是 vec3,因此使用第一种方法
看看这个post:
In this specific case where the generic type T is used as a parameter for GetMax the compiler can find out automatically which data type has to instantiate without having to explicitly specify it within angle brackets (like we have done before specifying and ). So we could have written instead: int i,j; GetMax (i,j);