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&lt;double, std::__1::allocator&lt;double&gt; &gt;' 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 返回一个向量的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL的GLM库没有幅度函数吗?

如何通过引用返回一个向量,隐含地期望一个空向量作为输入?

返回一个空向量c ++ [重复]

为啥我不能返回这个向量向量?

如何创建一个给定正整数的函数,返回一个向量,该向量的数字是 5 的倍数?

高效返回二维向量