vir a cabeça neste momento, mas é importante termos em mente que as aplicações
do Kinect vão além de um computador ou notebook, existem diversos projetos em
que o Kinect é utilizado em um totem ou em um dispositivo que se move, ou seja, o uso do acelerômetro se estende por todos os casos em que orientação do sensor é alterada.
Entendendo o acelerômetro no SDK
As informações do acelerômetro no SDK são disponibilizadas atra-
vés de um método da já conhecida classe
KinectSensor.
O método
AccelerometerGetCurrentReading()
retorna as informações sobre o
acelerômetro em um vetor de 4 posições (X, Y, Z e W) sendo que W sempre terá o
valor zero.
Apesar de parecer estranho em um primeiro momento que haja a posição W no
retorno de algo que deveria estar em um sistemas de coordenadas de três dimensões, faz total sentido se conhecermos o conceito de coordenadas homogêneas. Trata-se de uma ideia bem simples e poderosa: basicamente você representa as coordenadas X, Y e Z em uma quádrupla ordenada*[X, Y, Z e W] onde X = X/W + 1, Y = Y/W + 1
e Z = Z/W +1. Este sistema permite representar projeções conhecidas como pontos impróprios, que são utilizados para representar o feixe de retas paralelas a um outro eixo. Existem diversas outras vantagens para isso ser utilizado, mas não cabe ao escopo deste livro descrever todas.
O sistema de coordenadas do acelerômetro do sensor está centralizado com o
dispositivo. Por padrão o retorno deste método, caso o Kinect esteja em uma superfície plana, será próximo a (x:0, y:-1.0, z:0 e w:0).
Infelizmente não há um evento nativo para quando estas informações são alte-
radas, é necessário monitorarmos manualmente, mas podemos e iremos criar um
sistema de eventos para fazer isso.
Aplicação
Vamos criar uma aplicação para medir o resultado do acelerômetro de tempos
em tempos, será bem simples e rápido e nos ajudará a perceber as variações que
ocorrem quando movimentamos o sensor (dependendo da quantidade de precisão
18
Casa do Código
Capítulo 3. Acelerômetro e Eixo Motorizado
que você utilize, ocorrerão pequenas variações mesmo com o dispositivo parado).
A primeira coisa a fazer é criar um novo projeto WPF no visual studio,
como já fizemos no capítulo 2. Os passos para configurar o sensor serão muito
simples, basta criar uma referência para nossa DLL auxiliar e utilizar o método InicializarPrimeiroSensor descrito em 2.1. Desta vez não precisamos ativar
nenhum outro recurso do Kinect, então poderemos simplesmente utilizar o método
já criado no construtor da janela, conforme o código a seguir.
public MainWindow()
{
InitializeComponent();
kinect = InicializadorKinect.InicializarPrimeiroSensor(0);
}
Você pode notar que não estamos declarando o objeto
KinectSensor
kinect no escopo do construtor da janela, você deve declará-lo no escopo da classe, pois iremos reutilizá-lo em outro método. Feito isso, já temos novamente nossa inicialização do sensor, agora iremos criar os componentes de tela para exibir os valores do acelerômetro nos eixos X, Y e Z, ignoraremos o eixo W, pois como citado acima ele sempre estará em 0 (zero).
Ao criar um novo projeto WPF o formulário deve estar apenas com um painel
do tipo Grid, vamos utilizar este mesmo painel para construir um layout em forma de tabela
cuja primeira coluna irá listar os eixos e a segunda, o valor de cada um.
XAML
Os projetos WPF utilizam o XAML (eXtensible Application Markup
Language) para a construção da interface, esta é uma linguagem de mar-
cação simples que possui foco em aplicações desktop com um papel si-
milar ao HTML e CSS para aplicações Web.
Para que esta janela ocupe apenas o espaço necessário, iremos diminuir o seu
tamanho, para isso vamos alterar os valores das propriedades Width e Height
para os valores 300 e 150 respectivamente. Com isso, a janela ficou bem pequena, mas é suficiente para mostrarmos essas informações.
Feito isso, já podemos escolher o tamanho das linhas e colunas para exibir as
informações. Como já dito antes iremos mostrar os valores dos eixos X, Y e Z, por-19
3.1. Acelerômetro
Casa do Código
tanto precisamos de três linhas do mesmo tamanho. Para fazer isso você deve criar a definição das linhas, conforme o código a seguir.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
</Grid>
Esta é a sintaxe para a criação das definições de linhas. Note que a propriedade Height está com o valor (*), este valor indica proporcionalidade, ou seja, todas as linhas ficarão com o mesmo tamanho caso uma linha receba o valor (2*), ela teria o dobro do tamanho das outras.
Agora iremos definir as duas colunas. A sintaxe é muito similar, mas ao invés
de utilizarmos a propriedade Height que indica altura, iremos utilizar a propriedade Width que indica largura. Além disso, as colunas não irão possuir os mesmos valores proporcionalmente, pois a primeira irá exibir apenas uma letra referente ao seu eixo e a segunda irá receber um número com diversas casas decimais. O tamanho da primeira coluna será fixo em 50 pixels enquanto que a segunda irá ocupar todo o restante da janela, o código a seguir mostra como a tag Grid ficou após estas definições.