mirror of
https://github.com/overte-org/overte.git
synced 2025-07-17 07:56:48 +02:00
add rotate and transform filters for poses
This commit is contained in:
parent
bab7d1e596
commit
82166f4947
11 changed files with 218 additions and 13 deletions
|
@ -25,6 +25,7 @@
|
||||||
#include "filters/PulseFilter.h"
|
#include "filters/PulseFilter.h"
|
||||||
#include "filters/ScaleFilter.h"
|
#include "filters/ScaleFilter.h"
|
||||||
#include "filters/TranslateFilter.h"
|
#include "filters/TranslateFilter.h"
|
||||||
|
#include "filters/TransformFilter.h"
|
||||||
|
|
||||||
using namespace controller;
|
using namespace controller;
|
||||||
|
|
||||||
|
@ -39,6 +40,7 @@ REGISTER_FILTER_CLASS_INSTANCE(InvertFilter, "invert")
|
||||||
REGISTER_FILTER_CLASS_INSTANCE(ScaleFilter, "scale")
|
REGISTER_FILTER_CLASS_INSTANCE(ScaleFilter, "scale")
|
||||||
REGISTER_FILTER_CLASS_INSTANCE(PulseFilter, "pulse")
|
REGISTER_FILTER_CLASS_INSTANCE(PulseFilter, "pulse")
|
||||||
REGISTER_FILTER_CLASS_INSTANCE(TranslateFilter, "translate")
|
REGISTER_FILTER_CLASS_INSTANCE(TranslateFilter, "translate")
|
||||||
|
REGISTER_FILTER_CLASS_INSTANCE(TransformFilter, "transform")
|
||||||
|
|
||||||
const QString JSON_FILTER_TYPE = QStringLiteral("type");
|
const QString JSON_FILTER_TYPE = QStringLiteral("type");
|
||||||
const QString JSON_FILTER_PARAMS = QStringLiteral("params");
|
const QString JSON_FILTER_PARAMS = QStringLiteral("params");
|
||||||
|
@ -112,6 +114,69 @@ bool Filter::parseVec3Parameter(const QJsonValue& parameters, const QString& nam
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Filter::parseMat4Parameter(const QJsonValue& parameters, const QString& name, glm::mat4& output) {
|
||||||
|
if (parameters.isObject()) {
|
||||||
|
auto objectParameters = parameters.toObject();
|
||||||
|
|
||||||
|
|
||||||
|
if (objectParameters.contains("r0c0") &&
|
||||||
|
objectParameters.contains("r1c0") &&
|
||||||
|
objectParameters.contains("r2c0") &&
|
||||||
|
objectParameters.contains("r3c0") &&
|
||||||
|
objectParameters.contains("r0c1") &&
|
||||||
|
objectParameters.contains("r1c1") &&
|
||||||
|
objectParameters.contains("r2c1") &&
|
||||||
|
objectParameters.contains("r3c1") &&
|
||||||
|
objectParameters.contains("r0c2") &&
|
||||||
|
objectParameters.contains("r1c2") &&
|
||||||
|
objectParameters.contains("r2c2") &&
|
||||||
|
objectParameters.contains("r3c2") &&
|
||||||
|
objectParameters.contains("r0c3") &&
|
||||||
|
objectParameters.contains("r1c3") &&
|
||||||
|
objectParameters.contains("r2c3") &&
|
||||||
|
objectParameters.contains("r3c3")) {
|
||||||
|
|
||||||
|
output[0][0] = objectParameters["r0c0"].toDouble();
|
||||||
|
output[0][1] = objectParameters["r1c0"].toDouble();
|
||||||
|
output[0][2] = objectParameters["r2c0"].toDouble();
|
||||||
|
output[0][3] = objectParameters["r3c0"].toDouble();
|
||||||
|
output[1][0] = objectParameters["r0c1"].toDouble();
|
||||||
|
output[1][1] = objectParameters["r1c1"].toDouble();
|
||||||
|
output[1][2] = objectParameters["r2c1"].toDouble();
|
||||||
|
output[1][3] = objectParameters["r3c1"].toDouble();
|
||||||
|
output[2][0] = objectParameters["r0c2"].toDouble();
|
||||||
|
output[2][1] = objectParameters["r1c2"].toDouble();
|
||||||
|
output[2][2] = objectParameters["r2c2"].toDouble();
|
||||||
|
output[2][3] = objectParameters["r3c2"].toDouble();
|
||||||
|
output[3][0] = objectParameters["r0c3"].toDouble();
|
||||||
|
output[3][1] = objectParameters["r1c3"].toDouble();
|
||||||
|
output[3][2] = objectParameters["r2c3"].toDouble();
|
||||||
|
output[3][3] = objectParameters["r3c3"].toDouble();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Filter::parseQuatParameter(const QJsonValue& parameters, const QString& name, glm::quat& output) {
|
||||||
|
if (parameters.isObject()) {
|
||||||
|
auto objectParameters = parameters.toObject();
|
||||||
|
if (objectParameters.contains("w") &&
|
||||||
|
objectParameters.contains("x") &&
|
||||||
|
objectParameters.contains("y") &&
|
||||||
|
objectParameters.contains("z")) {
|
||||||
|
|
||||||
|
output = glm::quat(objectParameters["w"].toDouble(),
|
||||||
|
objectParameters["x"].toDouble(),
|
||||||
|
objectParameters["y"].toDouble(),
|
||||||
|
objectParameters["z"].toDouble());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,8 @@ namespace controller {
|
||||||
|
|
||||||
static bool parseSingleFloatParameter(const QJsonValue& parameters, const QString& name, float& output);
|
static bool parseSingleFloatParameter(const QJsonValue& parameters, const QString& name, float& output);
|
||||||
static bool parseVec3Parameter(const QJsonValue& parameters, const QString& name, glm::vec3& output);
|
static bool parseVec3Parameter(const QJsonValue& parameters, const QString& name, glm::vec3& output);
|
||||||
|
static bool parseMat4Parameter(const QJsonValue& parameters, const QString& name, glm::mat4& output);
|
||||||
|
static bool parseQuatParameter(const QJsonValue& parameters, const QString& name, glm::quat& output);
|
||||||
protected:
|
protected:
|
||||||
static Factory _factory;
|
static Factory _factory;
|
||||||
};
|
};
|
||||||
|
|
|
@ -27,6 +27,8 @@
|
||||||
#include "filters/PulseFilter.h"
|
#include "filters/PulseFilter.h"
|
||||||
#include "filters/ScaleFilter.h"
|
#include "filters/ScaleFilter.h"
|
||||||
#include "filters/TranslateFilter.h"
|
#include "filters/TranslateFilter.h"
|
||||||
|
#include "filters/TransformFilter.h"
|
||||||
|
#include "filters/RotateFilter.h"
|
||||||
#include "conditionals/AndConditional.h"
|
#include "conditionals/AndConditional.h"
|
||||||
|
|
||||||
using namespace controller;
|
using namespace controller;
|
||||||
|
@ -105,11 +107,20 @@ QObject* RouteBuilderProxy::deadZone(float min) {
|
||||||
}
|
}
|
||||||
|
|
||||||
QObject* RouteBuilderProxy::translate(glm::vec3 translate) {
|
QObject* RouteBuilderProxy::translate(glm::vec3 translate) {
|
||||||
qDebug() << __FUNCTION__ << "translate:" << translate;
|
|
||||||
addFilter(std::make_shared<TranslateFilter>(translate));
|
addFilter(std::make_shared<TranslateFilter>(translate));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QObject* RouteBuilderProxy::transform(glm::mat4 transform) {
|
||||||
|
addFilter(std::make_shared<TransformFilter>(transform));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
QObject* RouteBuilderProxy::rotate(glm::quat rotation) {
|
||||||
|
addFilter(std::make_shared<RotateFilter>(rotation));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
QObject* RouteBuilderProxy::constrainToInteger() {
|
QObject* RouteBuilderProxy::constrainToInteger() {
|
||||||
addFilter(std::make_shared<ConstrainToIntegerFilter>());
|
addFilter(std::make_shared<ConstrainToIntegerFilter>());
|
||||||
return this;
|
return this;
|
||||||
|
|
|
@ -49,6 +49,8 @@ class RouteBuilderProxy : public QObject {
|
||||||
Q_INVOKABLE QObject* constrainToInteger();
|
Q_INVOKABLE QObject* constrainToInteger();
|
||||||
Q_INVOKABLE QObject* constrainToPositiveInteger();
|
Q_INVOKABLE QObject* constrainToPositiveInteger();
|
||||||
Q_INVOKABLE QObject* translate(glm::vec3 translate);
|
Q_INVOKABLE QObject* translate(glm::vec3 translate);
|
||||||
|
Q_INVOKABLE QObject* transform(glm::mat4 transform);
|
||||||
|
Q_INVOKABLE QObject* rotate(glm::quat rotation);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void to(const Endpoint::Pointer& destination);
|
void to(const Endpoint::Pointer& destination);
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
//
|
||||||
|
// Created by Brad Hefta-Gaub 2017/04/11
|
||||||
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "RotateFilter.h"
|
||||||
|
|
||||||
|
#include <QtCore/QJsonObject>
|
||||||
|
#include <QtCore/QJsonArray>
|
||||||
|
|
||||||
|
#include <StreamUtils.h>
|
||||||
|
|
||||||
|
using namespace controller;
|
||||||
|
|
||||||
|
bool RotateFilter::parseParameters(const QJsonValue& parameters) {
|
||||||
|
static const QString JSON_ROTATION = QStringLiteral("rotation");
|
||||||
|
return parseQuatParameter(parameters, JSON_ROTATION, _rotation);
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
//
|
||||||
|
// Created by Brad Hefta-Gaub 2017/04/11
|
||||||
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifndef hifi_Controllers_Filters_Rotate_h
|
||||||
|
#define hifi_Controllers_Filters_Rotate_h
|
||||||
|
|
||||||
|
#include <glm/gtx/transform.hpp>
|
||||||
|
|
||||||
|
#include "../Filter.h"
|
||||||
|
|
||||||
|
namespace controller {
|
||||||
|
|
||||||
|
class RotateFilter : public Filter {
|
||||||
|
REGISTER_FILTER_CLASS(RotateFilter);
|
||||||
|
public:
|
||||||
|
RotateFilter() { }
|
||||||
|
RotateFilter(glm::quat rotation) : _rotation(rotation) {}
|
||||||
|
|
||||||
|
virtual float apply(float value) const override { return value; }
|
||||||
|
|
||||||
|
virtual Pose apply(Pose value) const override {
|
||||||
|
glm::quat temp = _rotation;
|
||||||
|
return value.transform(glm::mat4(temp));
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool parseParameters(const QJsonValue& parameters) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
glm::quat _rotation;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,21 @@
|
||||||
|
//
|
||||||
|
// Created by Bradley Austin Davis 2015/10/25
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "TransformFilter.h"
|
||||||
|
|
||||||
|
#include <QtCore/QJsonObject>
|
||||||
|
#include <QtCore/QJsonArray>
|
||||||
|
|
||||||
|
#include <StreamUtils.h>
|
||||||
|
|
||||||
|
using namespace controller;
|
||||||
|
|
||||||
|
bool TransformFilter::parseParameters(const QJsonValue& parameters) {
|
||||||
|
static const QString JSON_TRANSFORM = QStringLiteral("transform");
|
||||||
|
return parseMat4Parameter(parameters, JSON_TRANSFORM, _transform);
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
//
|
||||||
|
// Created by Brad Hefta-Gaub 2017/04/11
|
||||||
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifndef hifi_Controllers_Filters_Transform_h
|
||||||
|
#define hifi_Controllers_Filters_Transform_h
|
||||||
|
|
||||||
|
#include <glm/gtx/transform.hpp>
|
||||||
|
|
||||||
|
#include "../Filter.h"
|
||||||
|
|
||||||
|
namespace controller {
|
||||||
|
|
||||||
|
class TransformFilter : public Filter {
|
||||||
|
REGISTER_FILTER_CLASS(TransformFilter);
|
||||||
|
public:
|
||||||
|
TransformFilter() { }
|
||||||
|
TransformFilter(glm::mat4 transform) : _transform(transform) {}
|
||||||
|
|
||||||
|
virtual float apply(float value) const override {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual Pose apply(Pose value) const override {
|
||||||
|
return value.transform(_transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool parseParameters(const QJsonValue& parameters) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
glm::mat4 _transform;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -17,7 +17,5 @@ using namespace controller;
|
||||||
|
|
||||||
bool TranslateFilter::parseParameters(const QJsonValue& parameters) {
|
bool TranslateFilter::parseParameters(const QJsonValue& parameters) {
|
||||||
static const QString JSON_TRANSLATE = QStringLiteral("translate");
|
static const QString JSON_TRANSLATE = QStringLiteral("translate");
|
||||||
bool result = parseVec3Parameter(parameters, JSON_TRANSLATE, _translate);
|
return parseVec3Parameter(parameters, JSON_TRANSLATE, _translate);
|
||||||
qDebug() << __FUNCTION__ << "_translate:" << _translate;
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,8 +12,6 @@
|
||||||
|
|
||||||
#include <glm/gtx/transform.hpp>
|
#include <glm/gtx/transform.hpp>
|
||||||
|
|
||||||
#include <StreamUtils.h>
|
|
||||||
|
|
||||||
#include "../Filter.h"
|
#include "../Filter.h"
|
||||||
|
|
||||||
namespace controller {
|
namespace controller {
|
||||||
|
@ -21,12 +19,8 @@ namespace controller {
|
||||||
class TranslateFilter : public Filter {
|
class TranslateFilter : public Filter {
|
||||||
REGISTER_FILTER_CLASS(TranslateFilter);
|
REGISTER_FILTER_CLASS(TranslateFilter);
|
||||||
public:
|
public:
|
||||||
TranslateFilter() {
|
TranslateFilter() { }
|
||||||
qDebug() << __FUNCTION__;
|
TranslateFilter(glm::vec3 translate) : _translate(translate) {}
|
||||||
}
|
|
||||||
TranslateFilter(glm::vec3 translate) : _translate(translate) {
|
|
||||||
qDebug() << __FUNCTION__ << "translate:" << translate;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual float apply(float value) const override {
|
virtual float apply(float value) const override {
|
||||||
return value;
|
return value;
|
||||||
|
|
|
@ -14,7 +14,17 @@ var MAPPING_NAME = "com.highfidelity.examples.puppetFeet3";
|
||||||
var mapping = Controller.newMapping(MAPPING_NAME);
|
var mapping = Controller.newMapping(MAPPING_NAME);
|
||||||
var puppetOffset = { x: 0, y: -1, z: 0 };
|
var puppetOffset = { x: 0, y: -1, z: 0 };
|
||||||
|
|
||||||
mapping.from(Controller.Standard.LeftHand).peek().translate(puppetOffset).to(Controller.Standard.LeftFoot);
|
var rotation = Quat.fromPitchYawRollDegrees(0, 0, -90);
|
||||||
|
var noTranslation = { x: 0, y: 0, z: 0 };
|
||||||
|
var transformMatrix = Mat4.createFromRotAndTrans(rotation, noTranslation);
|
||||||
|
var rotateAndTranslate = Mat4.createFromRotAndTrans(rotation, puppetOffset);
|
||||||
|
|
||||||
|
|
||||||
|
mapping.from(Controller.Standard.LeftHand).peek().rotate(rotation).translate(puppetOffset).to(Controller.Standard.LeftFoot);
|
||||||
|
|
||||||
|
//mapping.from(Controller.Standard.LeftHand).peek().translate(puppetOffset).to(Controller.Standard.LeftFoot);
|
||||||
|
//mapping.from(Controller.Standard.LeftHand).peek().transform(transformMatrix).translate(puppetOffset).to(Controller.Standard.LeftFoot);
|
||||||
|
//mapping.from(Controller.Standard.LeftHand).peek().transform(rotateAndTranslate).to(Controller.Standard.LeftFoot);
|
||||||
|
|
||||||
Controller.enableMapping(MAPPING_NAME);
|
Controller.enableMapping(MAPPING_NAME);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue