glm::dot 返回一个向量
Posted
技术标签:
【中文标题】glm::dot 返回一个向量【英文标题】:glm::dot returns a vector 【发布时间】:2016-02-25 13:28:37 【问题描述】:我的向量声明如下:
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
不应该返回一个标量值(double
)吗?
【问题讨论】:
为什么不使用 glm 向量类型,例如glm::dvec3
?
【参考方案1】:
我可能误会自己了,但是这个错误必须来自参数类型,而不是返回类型,glm::dot 从未将任何 std::vector 作为参数,并且它不是 vec2 或 vec3 等。 (不是 glm 类型),它可能会尝试将其转换为一维值以执行一维标量积
【讨论】:
【参考方案2】:正如 Guiroux 所说,第一个问题是您使用的是 std::vector 而不是 glm 向量(例如 vec3)。另一方面,更改后,您将在 vec3 和 float 之间进行无效转换
你可以试试这个:
glm::vec3 a;
glm::vec3 b;
glm::dot<3, float, glm::qualifier::highp>(a, b);
由于 GLM 有两种方法 dot
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,因此使用第一种方法
看看这篇文章:
Templates C++
在这种将泛型类型 T 用作参数的特定情况下 对于 GetMax,编译器可以自动找出哪种数据类型具有 无需在角度内明确指定即可实例化 括号(就像我们在指定 and 之前所做的那样)。所以我们 可以改为: int i,j; GetMax(i,j);
【讨论】:
【参考方案3】:只是为了重申上面所说的内容,试试这个:
glm::dvec3 vec1;
glm::dvec3 vec2;
double result = glm::dot(vec1, vec2);
【讨论】:
这不起作用。 glm::dot 将尝试抱怨 double 和 dvec3 之间的转换无效。 真的吗?我只是再次查看了我的代码,它对我有用。如果你给它两个 dvec3,那么你会得到一个双倍的。 是的,我想通了,CLion IDE 确实很新,有时运行不正常。我的错,它给出了一个错误,因为它无法处理函数模板。以上是关于glm::dot 返回一个向量的主要内容,如果未能解决你的问题,请参考以下文章